py2exe:为什么某些标准模块未被包含?

3 投票
1 回答
1041 浏览
提问于 2025-04-16 18:06

我的Python程序使用插件(就是一些Python文件),我通过一个叫__import__的方式动态导入这些插件。我用py2exe把我的Python程序打包成Windows的exe文件。

我刚花了两个小时在找为什么我的插件Python文件在exe版本中无法正确加载。出现了一个ImportError错误,提示“没有名为urllib2的模块”。原来我的插件使用了urllib2(通过import urllib2语句),而这个标准库模块似乎没有被打包进exe里。插件中用到的其他模块(比如reurllib等)没有问题,可能是因为它们已经在我静态包含的Python文件中被引用了。

我怎么才能知道py2exe默认会把哪些标准Python库模块打包进exe里呢?(这样我就知道我或其他人能否在插件中使用它们)。py2exe的文档没有给出提示,除了提到它会包含很多标准库中的模块。

1 个回答

4

要查看包含了哪些模块,可以打开 library.zip 文件。如果没有这个文件,可以尝试用任何压缩软件打开 EXE 文件,或者把它重命名为 .ZIP 后再试着打开。

你会看到一份 *.pyc 文件的列表。通过查看这些文件和文件夹,你可以大致了解哪些模块被包含了,哪些没有。

如果你需要添加某个特定的包,可以把它加到 'packages' 列表里。

至于为什么不包含所有东西,或者它是如何选择包含某些模块而不包含其他模块的?我的理解是,py2exe 会查看你的代码,找出你用到了哪些东西,然后把这些模块包含进来(还有一些它自己可能需要的模块)。不过,它可能也有一些规则来添加其他模块(我还没仔细检查过 :)

撰写回答