在Windows 98中通过网络访问py2exe程序会抛出ImportErrors

时间:2010-01-05 23:13:58

标签: 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,其中包含所有.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计算机,但我只能在他们的商店开业前每天早上访问非工作的计算机(我的客户)。

提前致谢!


编辑:好的,向前迈出了一大步。使用PY2EXE_VERBOSE进行调试后,特定W98SE计算机上出现的问题是在查找导入时没有使用正确的路径语法。首先,它似乎没有读取PYTHONPATH环境变量(可能有一个我不知道的py2exe特定的,如PY2EXE_VERBOSE)。

其次,它只放弃在放弃之前放在一个地方(如果文件捆绑在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?

2 个答案:

答案 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)

这个问题不再是我的问题,我找到了另一种解决方案(可能会或可能不会让我在那里辞职)。接受此答案,直到其他人能提供更满意的解决方案。