PyInstaller未能包含C:\Python27\Lib中的某些模块
我之前一直能顺利地用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 个回答
对于使用unix/linux的朋友们,确保在编译时引用的包和应用程序使用的是同一套。这种问题通常发生在使用虚拟环境的时候。为了解决这个问题,找到已安装的包的文件夹,然后编辑一下 myapp.spec
文件。接着运行
pyinstaller myapp.spec
我在打包一个使用了 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
详细说明可以参考 这里。
找到了解决办法,虽然不一定是问题的根源。以下是我更新后的构建命令:
pyinstaller --hidden-import=timeit --hidden-import=bisect -F MyMainModule.py
我还是不明白为什么PyInstaller突然忘记了怎么找到这两个模块(而且就这两个模块)在其他20多个模块中,它们都能正确包含在构建里。