1. 程式人生 > >pyinstaller 打包時出錯解決方案

pyinstaller 打包時出錯解決方案

最近用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

完了能夠正常打包執行!問題解決。

總結:出現問題之後要多做實驗,多思考原理。