2.3a1: importhooks oddity

Hans Nowak wurmy at earthlink.net
Thu Jan 2 14:46:08 EST 2003


[me]
>>Yes, this works... a whole slew of Wahey's. :-)  So it's not a bug, but this 
>>behavior is still a bit confusing, at least on Windows (as opposed to other 
>>platforms where it seems to work as expected). Is this the desired behavior? 

[JvR]
> Can you provide more details? Your original example showed that on 
> cygwin there was a fresh sys.path item (perhaps added by site.py or 
> after site.py was run) not yet "touched" by an import, and on Windows 
> there wasn't. You could compare sys.path with and without the -S ("no 
> site.py") option.

OK, updated code:

import sys

print '' in sys.path
print '' in sys.path_importer_cache.keys()

def f(path):
     print "Wahey!", `path`
     raise ImportError

sys.path_hooks.append(f)

import nothing

On Windows:

(P:\test\2.3) $ python test-importhooks-2.py
True
True
Traceback (most recent call last):
   File "test-importhooks-2.py", line 14, in ?
     import nothing  # needless to say, doesn't exist
ImportError: No module named nothing

On Cygwin:

(P:\test\2.3) $ c:\cygwin\usr\local\bin\python2.3.exe test-importhooks-2.py
True
False
Wahey! ''
Traceback (most recent call last):
   File "test-importhooks-2.py", line 14, in ?
     import nothing  # needless to say, doesn't exist
ImportError: No module named nothing

The empty string '' isn't a key in sys.path_importer_cache, apparently. 
(Interesting, when I run Cygwin-Python's interactive interpreter, and inspect 
sys.path_importer_cache, the empty string *is* there...)

When run with -S, both scripts produce a whole list of Wahey's, and the two 
conditions at the beginning are True and False, respectively.

>>If I understand correctly, then registering any function or class in
>>path_hooks is useless on Windows for path "", since it will be bypassed.
> 
> Not sure what you mean. I'd think you could still register a hook for "" 
> and make it do "something".

Hmm, well, I mean, that if a Windows user innocently runs code like

def f(path):
     # do something...

sys.path_hooks.append(f)

then this has no effect at all, because the function is just skipped.  Sure, I 
now know that I have to clear the cache (or maybe manipulate it in other ways), 
but this behavior still seems confusing. (And on a superficial level, *appear* 
to be non-portable... a script would work on one platform but not on the 
other.)  Now I realize that installing import hooks is not something you'd do 
every day, and probably not for the faint of heart, but still... maybe this 
caveat should be documented somewhere?

-- 
Hans (base64.decodestring('d3VybXlAZWFydGhsaW5rLm5ldA=='))
# decode for email address ;-)
The Pythonic Quarter:: http://www.awaretek.com/nowak/
Kaa:: http://www.awaretek.com/nowak/kaa.html





More information about the Python-list mailing list