PyInstaller未能包含C:\Python27\Lib中的某些模块

10 投票
4 回答
35627 浏览
提问于 2025-04-17 20:23

我之前一直能顺利地用PyInstaller制作一个Tkinter工具程序的可执行文件,但今天早上突然出现了问题,生成的可执行文件在尝试导入C:\Python27\Lib中的模块时出错,比如“timeit”和“bisect”。

这个脚本单独运行是没问题的,只有可执行文件出现了问题。

有没有人知道是什么原因导致这种情况发生的?或者有什么办法可以强制修复这个问题?

[编辑] 这是可执行文件报告的具体错误:

Traceback (most recent call last):
  File "<string>", line 35, in <module>
  File "../..\utils\InterpolatedArray.py", line 12, in <module>
    import bisect
ImportError: No module named bisect

当我注释掉这个模块的使用(以绕过bisect的导入)时,接下来又在导入timeit时出错。运行脚本本身时没有出现这些错误。

[编辑2] PyInstaller会创建它所需的目录(./build和./dist),而且没有权限问题。PyInstaller的构建过程没有错误。

[编辑3] 这是我使用的构建命令:

pyinstaller -F MyMainModule.py

4 个回答

0

对于使用unix/linux的朋友们,确保在编译时引用的包和应用程序使用的是同一套。这种问题通常发生在使用虚拟环境的时候。为了解决这个问题,找到已安装的包的文件夹,然后编辑一下 myapp.spec 文件。接着运行

pyinstaller myapp.spec
5

我在打包一个使用了 openpyxl 的 Python 脚本时遇到了类似的问题。这里是我的解决办法。

第一步:安装 Python 模块 openpyxl

$ wine python.exe Scripts/pip.exe install openpyxl

第二步:添加 openpyxl 的路径

openpyxl 的路径(~/.wine/drive_c/Python27/Lib/site-packages)添加到应用程序规格文件中的 Analysis 对象里的 pathex 中(比如说,ProcessSpreadsheet.spec)。

a = Analysis(['ProcessSpreadsheet.py'],
             pathex=['C:\\Python27\\Scripts', '~/.wine/drive_c/Python27/Lib/site-packages'],
             binaries=None,
             datas=None,
             hiddenimports=[],
             hookspath=[],
             runtime_hooks=[],
             excludes=[],
             win_no_prefer_redirects=False,
             win_private_assemblies=False,
             cipher=block_cipher)

第三步:重新构建

$ wine pyinstaller.exe ProcessSpreadsheet.spec

详细说明可以参考 这里

15

找到了解决办法,虽然不一定是问题的根源。以下是我更新后的构建命令:

pyinstaller --hidden-import=timeit --hidden-import=bisect -F MyMainModule.py

我还是不明白为什么PyInstaller突然忘记了怎么找到这两个模块(而且这两个模块)在其他20多个模块中,它们都能正确包含在构建里。

撰写回答