rb-site fails to detect memcache when installed from an egg

Review Request #843 — Created April 28, 2009 and submitted

Review Board SVN (deprecated)
rb-site fails to detect the "memcache" module when memcache is installed as an egg.  Something about imp.find_module does not honor sys.path_hooks and doesn't use the zipimporter.  This appears to be true in 2.4, 2.5, and 2.6.
Ran "rb-site install", now properly detects memcache installation.
  1. BTW, pkgutil.find_loader() seems to do the right thing in terms of examining sys.path_hooks, but it's not documented in the official Python docs, so I don't know if you'd rather use that (I'm not sure if the original intent was to avoid __import__ to avoid any side effects of actually importing the module).
    1. Python 2.4 doesn't seem to have pkgutil.find_loader. The import should be fine for our needs here.
  1. That's good to know, and really annoying. We do a bunch of these checks in reviewboard/admin/checks.py, too, and I haven't seen anyone hit these issues... Hmm...
    I think doing an import is fine. I was just going to avoid actually importing, but if we need to, that's fine.
  2. Python 2.4, I believe, will grumble loudly about this, because it doesn't provide default arguments. This should be more like:
       __import__(name, {}, {}, [])
    1. 2.4 seems to be optional, too.  From the source: PyArg_ParseTuple(args, "s|OOO:__import__",
      As for not running into the problem very often, it is somewhat rare to have a Zipped egg (this is only a problem for zipped ones -- unzipped eggs work okay because find_module honors .pth files).  For one reason or another, eggs tend not to be zip-safe (with extension Modules, for example), so that's why it probably hasn't shown up much.  I see in checks.py that you ran into a problem with importing DNS, for example, but Pygments works because it installs in unzipped format.
    2. You're right. I was thinking back to a problem I hit before, and it wasn't default arguments, it was using keyword arguments. I wanted to specify the last argument as a keyword argument instead of providing the other defaults, and couldn't in 2.4. Defaults work fine.
  1. Committed as r1944.