我正在从多台客户端计算机上的一台服务器计算机上运行py2exe编译的python程序(映射到每台计算机上的网络驱动器,比如W :)。
对于Windows XP及更高版本的计算机,到目前为止,Python拾取W:\ python23.dll没有问题(是的,我使用Python 2.3.5兼容W98)。然后它将使用W:\ zlib.pyd解压缩W:\ library.zip,其中包含所有.pyc文件,如os等,然后导入,程序运行没有问题。
我遇到的问题出现在某些Windows 98 SE计算机上(注意:某些Windows 98 SE计算机,其他计算机似乎没有明显问题)。会发生什么,程序从W:运行,W:\ python23.dll,我认为,发现(因为我得到Python ImportErrors,我们需要能够执行Python导入语句),但是有些事情不起作用:
1)如果W:\ library.zip包含唯一的.pyc文件副本,我会得到
ZipImportError: can't decompress data; zlib not available
(废话,考虑到W:\ zlib.pyd IS可用,并且可以在同一网络上的XP和更高版本的机器上正常工作)。
2)如果.pyc文件实际上是由py2exe捆绑在python exe中,或者放在与.exe相同的目录中,或者放入一个named子目录,然后将其设置为PYTHONPATH变量的一部分(例如W :\ pylib),我得到ImportError: no module named os
(os是导入的第一个模块,在sys和其他任何东西之前)。
来想一想,如果os之前导入了os,sys.path就无法搜索?我会尝试改变那些进口的顺序,但我的问题仍然存在:为什么这是一个零星的问题,在某些网络上工作但在其他网络上没有?我将如何强制Python查找捆绑在我运行的可执行文件中的文件? 我可以立即访问正在运行的Windows 98 SE计算机,但我只能在他们的商店开业前每天早上访问非工作的计算机(我的客户)。
提前致谢!
其次,它只放弃在放弃之前放在一个地方(如果文件捆绑在EXE中,它看起来就在那里。如果没有,它看起来在library.zip中。)
编辑2 :事实上,根据this,Python解释器中的sys.path与Py2exe可执行文件的sys.path之间存在差异。具体来说,sys.path contains only a single entry: the full pathname of the shared code archive.
Blah。没有后退?甚至不是当前的工作目录?我尝试将W:\
添加到PATH,但是py2exe不符合查找系统库的任何标准,因此它不起作用。
现在有趣的一点。它尝试加载atexit,os等的路径是:
W:\\library.zip\<module>.<ext>
注意library.zip之后的单斜杠,但是在驱动器号之后的双斜杠(有人纠正我,如果这是预期的并且应该工作)。看起来如果这是一个字符串文字,那么由于斜杠没有加倍,它被读作一个(无效的)转义序列并打印原始字符(给出W:\library.zipos.pyd, W:\library.zipos.dll, ...
而不是斜杠);如果它不是一个字符串文字,那么双斜杠可能不会自动进行normpath(因为它应该是),因此双斜杠会混淆模块加载器。就像我说的,我不能只是set PYTHONPATH=W:\\library.zip\\
,因为它忽略了那个变量。
在我的程序开始时使用sys.path.append可能是值得的,但硬编码模块路径是绝对的最佳选择,特别是因为问题发生在过时操作系统的一个配置中。
有什么想法吗?我有一个,这是为了sys.path
而怜悯我为此需要os
。另一种方法是再次将os.getenv('PATH')
或os.getenv('PYTHONPATH')
附加到sys.path ...,需要os
模块。 site
模块也无法初始化,因此我无法使用.pth文件。
我最近还在程序开始时尝试了以下代码:
for pth in sys.path:
fErr.write(pth)
fErr.write(' to ')
pth.replace('\\\\','\\') # Fix Windows 98 pathing issues
fErr.write(pth)
fErr.write('\n')
但它无法加载linecache.pyc或其他任何内容;它实际上无法从事物的外观中执行这些命令。有没有办法使用内置功能,不需要linecache动态修改sys.path?或者我减少了硬编码正确的sys.path?
答案 0 :(得分:2)
这不是直接的答案,但可能有所帮助。您熟悉Python中的-v
选项吗?输入python -h
了解详情。请注意,py2exe'd脚本的PYTHONVERBOSE
环境变量的等价物是PY2EXE_VERBOSE
,除了this post by its author之外几乎没有描述。显然,它可以取值1或2,基本上类似于-v
和-vv
,但与how PYTHONVERBOSE works略有不同。
还请注意您的sys.path想法:您是否已经导入sys
对您是否可以导入os
没有影响。也就是说,Python路径(在sys.path
中可见)总是可用的,因为它反映了解释器的内部特性,无论您是否导入了sys模块。
与许多其他模块一样,sys
是内置的,因此即使您的应用几乎完全残缺,它也应该始终可导入。如果它有帮助,您可以使用sys.builtin_module_names
查看它们适用于您的Python版本。如果解释器正在运行所有可用的信息,那么以下可能是您可以看到的最小的有用程序:
import sys
print sys.builtin_module_names
另外,我建议不要尝试在.exe中捆绑.pyc文件。你已经有足够的工作来反对你被困在支持Win98,如果我是你,我会选择最简单的方法让我完成工作并转向更有趣的领域。如果您可以正常安装Python并从源代码运行,那么您一定要考虑它! :)
已编辑以包含darvids0n每条评论的PY2EXE_VERBOSE信息链接。
答案 1 :(得分:-1)
这个问题不再是我的问题,我找到了另一种解决方案(可能会或可能不会让我在那里辞职)。接受此答案,直到其他人能提供更满意的解决方案。