我正在从许多客户端计算机上的一台服务器上运行py2exe编译的python程序(映射到每台计算机上的网络驱动器,例如W :)。
对于Windows XP和更高版本的计算机,到目前为止,Python拾取W:\ python23.dll的问题为零(是的,我使用Python 2.3.5实现W98兼容性等)。然后,它将使用W:\ zlib.pyd解压缩W:\ library.zip,其中包含os等此类所有.pyc文件,然后将其导入,程序不会出现问题。
我遇到的问题是在某些Windows 98 SE计算机上(注意:某些Windows 98 SE计算机,其他计算机似乎没有明显问题)。发生的是,该程序从W:运行,我认为找到了W:\ python23.dll(因为我收到Python ImportErrors,所以我们需要能够执行Python import语句),但是几件事情不起作用:
1)如果W:\ library.zip包含.pyc文件的唯一副本,我得到ZipImportError: can't decompress data; zlib not available
(废话,考虑到W:\ zlib.pyd是可用的,并且可以与同一网络上的XP和更高版本的机器正常工作)。
2)如果.pyc文件实际上是由py2exe捆绑在python exe里面的,或者放在与.exe相同的目录中,或者放在一个命名的子目录中,然后将该子目录设置为PYTHONPATH变量的一部分(例如W:\ pylib ),得到ImportError: no module named os
(os是导入的第一个模块,在sys及其他任何功能之前)。
想一想,如果没有导入os,可能无法搜索sys.path吗?我将尝试切换这些导入的顺序,但我的问题仍然存在:为什么这是一个零星的问题,在某些网络上有效,而在另一些网络上无效?以及如何迫使Python查找我运行的可执行文件中捆绑的文件?
我可以立即访问工作正常的Windows 98 SE机器,但是每天早上他们的商店开张之前,我只能访问工作不正常的机器(我的一位客户)。
提前致谢!
编辑:好的,向前迈出了一大步。在使用PY2EXE_VERBOSE进行调试之后,特定W98SE计算机上出现的问题是,在寻找导入时它没有使用正确的路径语法。首先,它似乎没有读取PYTHONPATH环境变量(可能存在我不知道的py2exe特定变量,例如PY2EXE_VERBOSE)。
其次,它只在放弃前在一个地方查找(如果文件捆绑在EXE中,则显示在该位置。否则,它显示在library.zip中)。
编辑2:实际上,根据this,Python解释器中的sys.path与Py2exe可执行文件之间存在差异。具体来说,sys.path contains only a single entry: the full pathname of the shared code archive.
布拉。没有后备吗?甚至没有当前的工作目录?我尝试将W:\
添加到PATH中,但是py2exe不符合用于定位系统库的任何标准,因此它将无法正常工作。
现在开始有趣的一点。它尝试从中加载atexit,os等的路径是:
W:\\library.zip\<module>.<ext>
注意library.zip之后的单斜杠,但驱动器号后的双斜杠(如果有此意图并且可以工作,请改正我)。看起来,如果这是一个字符串文字,则由于斜杠未加倍,因此将其视为(无效的)转义序列并打印了原始字符(给出W:\library.zipos.pyd, W:\library.zipos.dll, ...
而不是斜杠);如果不是字符串文字,则双斜杠可能不会被自动规范化(应该是),因此双斜杠会使模块加载器感到困惑。就像我说的那样,我不能只是set PYTHONPATH=W:\\library.zip\\
,因为它会忽略该变量。
在程序开始时使用sys.path.append可能是值得的,但是硬编码模块路径绝对是最后的手段,特别是因为问题是在过时的OS的一种配置中发生的。
有任何想法吗?我有一个,这是规范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或其他任何东西。它实际上不能从事物的外观执行那些命令。有什么方法可以使用不需要线缓存来动态修改sys.path的内置功能?还是我简化了对正确的sys.path的编码?
最佳答案
这不是直接的答案,但可能会有所帮助。您是否熟悉Python中的-v
选项。键入python -h
了解更多信息。请注意,与py2exe脚本的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
另外,建议不要尝试将.pyc文件捆绑到.exe中的任何尝试。您已经做好了充分的工作来防止您坚持支持Win98,如果您是我,我将采用最简单的方法,该方法可以使我完成工作并继续进入更有趣的领域。如果您可以正常安装Python并从源代码运行,则一定要考虑一下! :)
由darvids0n编辑为每个评论都包含指向PY2EXE_VERBOSE信息的链接。
关于python - 在Windows 98中通过网络访问py2exe程序会引发ImportErrors,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2009873/