pyinstaller 打包時出錯解決方案
阿新 • • 發佈:2019-02-14
最近用pyqt寫了一個小程式,打包成exe時候時候遇到一個奇怪的問題:點選生成的exe完全沒有反應。
那麼,請在生成exe的命令中去掉-w引數,讓程式有控制檯可以輸出錯誤資訊。
打包的py檔案可以寫成如下形式,當然用命令列也可以。
#!/usr/bin/env python3 # -*- coding: utf-8 -*- from PyInstaller.__main__ import run # -F:打包成一個EXE檔案 # -w:不帶console輸出控制檯,window窗體格式 # --paths:依賴包路徑 # --icon:圖示 # --noupx:不用upx壓縮 # --clean:清理掉臨時檔案 if __name__ == '__main__': opts = ['-F', #'--paths=D:\\Program Files\\Python\\Lib\\site-packages\\PyQt5\\Qt\\bin', #'--paths=D:\\Program Files\\Python\\Lib\\site-packages\\jpype', #'--noupx', #'--clean', #'--hidden-import=numpy', 'main.py'] run(opts)
再次執行exe,在控制檯(黑色命令視窗)中出現如下錯誤資訊:
ImportError: numpy.core.multiarray failed to import Traceback (most recent call last): File "main.py", line 6, in <module> File "D:\Program Files\Python\lib\site-packages\pyinstaller-3.4.dev0+355f0c76b-py3.6.egg\PyInstaller\loader\pyimod03_importers.py", line 627, in exec_module exec(bytecode, module.__dict__) File "figure.py", line 1, in <module> File "D:\Program Files\Python\lib\site-packages\pyinstaller-3.4.dev0+355f0c76b-py3.6.egg\PyInstaller\loader\pyimod03_importers.py", line 627, in exec_module exec(bytecode, module.__dict__) File "site-packages\jpype\__init__.py", line 17, in <module> File "D:\Program Files\Python\lib\site-packages\pyinstaller-3.4.dev0+355f0c76b-py3.6.egg\PyInstaller\loader\pyimod03_importers.py", line 627, in exec_module exec(bytecode, module.__dict__) File "site-packages\jpype\_jpackage.py", line 18, in <module> ImportError: numpy.core.multiarray failed to import [13484] Failed to execute script main
其中有兩條重要的資訊:
1、ImportError: numpy.core.multiarray failed to import
2、[1852] Failed to execute script main
中間的資訊無非是你程式中哪個地方引用了這個失敗的包。
在網上搜第一條錯誤資訊,會出現大量的升級numpy包就可以了的資訊。但是請注意,你是在打包之後才出現的問題,打包之前是能正常執行的,所以是打包出的錯,並不是numpy版本有問題。但是這時可以先升級numpy包版本。
此後新建一個測試py檔案,import numpy,此時對此新的py檔案打包時直接報錯,根本不能生成exe檔案。直接看報錯資訊,在網上搜,就可以得到結果,說是setuptools版本太低,導致打包出錯。參考 https://github.com/pyinstaller/pyinstaller/issues/3507
錯誤和解決辦法都在裡面。
錯誤內容大概如下:
File "f:\anaconda\lib\site-packages\PyInstaller\hooks\pre_safe_import_module\hook-setuptools.extern.six.moves.py", line 34, in pre_safe_import_module
for real_module_name, six_module_name in real_to_six_module_name.items():
AttributeError: 'str' object has no attribute 'items'
解決辦法就是升級setuptools,具體方法在cmd命令視窗中使用:pip install -U setuptools
完了能夠正常打包執行!問題解決。
總結:出現問題之後要多做實驗,多思考原理。