最近用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
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
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
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
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
完了能够正常打包运行!问题解决。
总结:出现问题之后要多做实验,多思考原理。