python - 在Windows 98中通过网络访问py2exe程序会引发ImportErrors

标签 python py2exe importerror python-module windows-98

我正在从许多客户端计算机上的一台服务器上运行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/

相关文章:

Python Numpy.loadtxt 具有不同的字符串条目,但知道行格式

python - 将字典中的值打印到新的 csv 文件中

python - "Symbol not found/Expected in: flat namespace"实际上是什么意思?

python - 从 python 3 脚本构建适用于 Windows 的 .exe

python - py2exe:未找到 dbm 克隆

python - 在终端中打开 python 时出错

python - Django,ImportError : cannot import name Celery, 可能的循环导入?

python - 如何在带有集合和范围集的 pyomo 中使用多级索引?

python - 使 PyInstaller exe 同时执行命令行和窗口

python - 如何使用 Pyserial 使 Windows 可执行?