Why do you think str() is needed here?
Because I'm not sure if sys.path was overwritten or changed. Some bad
modules could overwrite sys.path with another list. I know I'm paranoid.
Possibly because sys.path can start with '' which is interpreted as the
current directory. Perhaps when the code is started as a windows service
[I know nothing about windows services], the current directory is set to
%windir%\system32 (where lots of DLLs hang out), and if there is a
zlib.dll there, it will get picked up first. Try printing the current
directory (see above).
Okay, I did so. I wrote a service that prints out sys.path into a
logfile. Here is the result:
sys.path=['C:\\Python24\\lib\\site-packages\\win32', 'T:\\Python\\Lib',
'C:\\WINDOWS\\system32\\python24.zip', 'C:\\WINDOWS\\system32',
'C:\\Python24\\DLLs', 'C:\\Python24\\lib',
'C:\\Python24\\lib\\plat-win', 'C:\\Python24\\lib\\lib-tk',
'C:\\Python24\\lib\\site-packages\\win32', 'C:\\Python24',
'C:\\Python24\\lib\\site-packages',
'C:\\Python24\\lib\\site-packages\\PIL',
'C:\\Python24\\lib\\site-packages\\win32\\lib',
'C:\\Python24\\lib\\site-packages\\Pythonwin',
'C:\\Python24\\lib\\site-packages\\wx-2.6-msw-ansi',
'T:\\Python\\Projects\\NamedConnector']
The empty string is not on sys.path. This is very strange, because it is
different when I start the python interactively. The problem was caused
by "C:\WINDOWS\system32", not the empty string. I'm still not sure why
it is included in sys.path, and why '' is not there? I also checked the
Python documentation about sys.path, and read the thread mentioned
before but still sys.path is magical, and magic is not Pythonic.
Anyway, I think I have found the most platform independent solution.
Here it is:
>>> import _socket
>>> import os
>>> import sys
>>> dyndir = os.path.split(_socket.__file__)[0] # This can be "/usr/local/lib/python2.4/lib-dynload" or "C:\Python24\DLLs" or whatever
>>> sys.path.append(dyndir)
In most cases, '_socket.pyd' will be the first module that can be
imported, and it will by in the dynaload directory for sure.
I feel this is still unclean code. Do you think that it would be nice to
add new features to the sys module?
sys.dlpath - could be the path to the lib-dynload or DLLs folder
sys.libpath - could be the path to the lib folder
Setting the PYTHONVERBOSE environment variable may assist in showing
where modules are being loaded from.
This cannot be used in conjunction with a windows service, because its
output cannot be seen. :-(