classification
Title: zipimporter find_module fullname mis-documented
Type: behavior Stage: test needed
Components: Versions: Python 3.2, Python 2.7
process
Status: open Resolution:
Dependencies: Superseder:
Assigned To: Nosy List: cool-RR, kmtracey, rfk
Priority: normal Keywords:

Created on 2010-04-14 15:20 by kmtracey, last changed 2011-04-27 15:39 by cool-RR.

Messages (3)
msg103132 - (view) Author: Karen Tracey (kmtracey) Date: 2010-04-14 15:20
The fullname parameter to zipimporter find_module is documented to be a "fully qualified (dotted) module name". (From http://docs.python.org/library/zipimport.html#zipimport.zipimporter.find_module.) However, passing a fully-qualified dotted module appears to never work. Rather it appears that you must use the file system path separator instead of dots. For example on Windows:

C:\>echo %pythonpath%
\tmp\blah-1.0-py2.6.egg

C:\>python
Python 2.6.5 (r265:79096, Mar 19 2010, 21:48:26) [MSC v.1500 32 bit (Intel)] on win32
Type "help", "copyright", "credits" or "license" for more information.
>>> from blah.models import speak
>>> speak.__file__
'C:\\tmp\\blah-1.0-py2.6.egg\\blah\\models\\speak.pyc'
>>> speak.sayhi()
Hi from blah.models.speak sayhi function.

The egg has top-level blah package and under it models, it appears to work fine for normal use.  But zipimport zipimporter find_module won't find the models sub-module using dotted path notation:

>>> import sys
>>> sys.path[1]
'C:\\tmp\\blah-1.0-py2.6.egg'
>>> import zipimport
>>> zi = zipimport.zipimporter(sys.path[1])
>>> zi.find_module('blah')
<zipimporter object "C:\tmp\blah-1.0-py2.6.egg">
>>> zi.find_module('blah.models')
>>> zi.find_module('blah/models')
>>> zi.find_module('blah\\models')
<zipimporter object "C:\tmp\blah-1.0-py2.6.egg">
>>>

On Linux, the 'blah/models' version is the one that works.

Tested as far back as Python2.3 and as far forward as 2.7a3.
msg109467 - (view) Author: Ryan Kelly (rfk) Date: 2010-07-07 10:05
Was also just bitten by this, trying to muck with PEP-302-style import hooks.  Note that the documented behaviour of zipimporter is also the behaviour required by PEP 302, i.e. full dotted module name.
msg134584 - (view) Author: Ram Rachum (cool-RR) Date: 2011-04-27 15:39
I was bitten now as well...
History
Date User Action Args
2011-04-27 15:39:57cool-RRsetnosy: + cool-RR
messages: + msg134584
2010-08-04 22:18:08terry.reedysetstage: test needed
versions: + Python 3.2, - Python 2.6, Python 2.5
2010-07-07 10:05:58rfksetnosy: + rfk
messages: + msg109467
2010-04-14 15:20:40kmtraceycreate