Python Pyinstaller 打包程序及遇到的问题总结
一、如何打包py程序
1、安装打包模块
pip install pyinstaller
2、定义保存包的路径 CMD ,CD
比方:把最终*.exe运行文件,保存到H盘 install 文件夹下。
输入: H: CD [自己定义文件名]
3、打包生成
红字是我的py程序所在路径,--noconsol 是屏蔽黑色的控制窗口。
pyinstaller -F E:\PythonProgram\CSV\Call.py --noconsol
注意:*.py的路径中,文件夹中可以有中文,但是不能有空格。不然打包时报错。
执行命令后,exe文件自动生成在H盘下,build 文件可以删除掉。
4、给exe增加图标
pyinstaller -i E:\PythonProgarm\CSV\sun.ico -F E:\PythonProgarm\CSV\Call.py --noconsole
这里需要注意,程序复制到桌面才会有显示,另外上面的名字也可以写成: pyinstaller -F -i sun.ico E:\PythonProgarm\CSV\Call.py --noconsole 前提是*.ico需要和*.py文件在同一文件夹下。
5、指令含义
一些常用的功能参数,官方手册可参考:https://pyinstaller.readthedocs.io/en/stable/
二、打包程序遇到的一些问题
问题1:关于32位和64位系统
如果是64位环境打包的程序,只能给64位的电脑使用。如果需要在32位电脑上运行怎么办呢?
比较粗暴的方法是:使用2台电脑一台构建32位的环境,一台构建64位的环境。如果需要在64位电脑上同时打包
下面这里有另外博主的一些方法可以参考。
转载链接: https://www.hellomao.top/2019/05/25/python_pyinstaller/
https://blog.csdn.net/allan2222/article/details/88035116
问题2:运行中出现 :ImportError: unable to find Qt5Core.dll on PATH
这个问题主要是PyQt5 bug导致的,按照一些方法添加PyQt5到系统变量表中,问题没有解决。我又再网上查了一些其它方法。
解决方案:参考链接:https://blog.csdn.net/zwyact/article/details/99778898
代码前加以下代码或者使用更新版本的PyQt5
import sys, os if hasattr(sys, 'frozen'): os.environ['PATH'] = sys._MEIPASS + ";" + os.environ['PATH']
问题3:安装不上PyQt5 5.13
执行以下命令 安装不上pyqt5
pip install PyQt5 -i https://pypi.douban.com/simple
解决方案:降低Python 版本,我自己测试安装32位Windos系统的Python 3.8 版本,在pip pyqt5 时,CMD安装不上,
安装Pytnon 3.7 版本没有问题。
问题4:no module named
方法1、使用-p 指令 增加模块路径
红字部分增加你的模块路径,路径尾部需要使用;分号。蓝字是运行程序路径。
pyinstaller -F -p F:\python_program\test; F:\python_program\test\main.py
方法2、指定添加
2.1:打包指定模块
命令行模式:
--hidden-import Modulename 可以多次使用
例:--hidden-import docx --hidden-import Pillow
修改spec模式:
hiddenimports=['docx'],
例:hiddenimports=['docx', 'Pillow'],
2.2:打包指定文件
命令行模式:
--add-data file 可以多次使用,注意格式为引号里面有一个文件名,有一个分号,一个点。
例: --add-data "default.docx;."
修改spec模式:
datas=[('default.docx', '.')],
该方法也可以指定其它自定义的文件如:Config.Json等指定后,文件会添加到根目录下。
2.3:打包后调用静态文件
#根据系统运行位置确认basedir路径
if getattr(sys, 'frozen', None):
basedir = sys._MEIPASS
else:
basedir = os.path.dirname(__file__)
#调用
#接上例,打包进去的default.docx,加到了.这个根目录。
docx=os.path.join(basedir, 'default.docx')
加入文件的时候,有一个参数‘.’,这是加入包的路径,后面引用的时候,如果是解压运行,就到解压目录的根目录找。
如果不是解压的,就到该文件路径下找。
如果加入更多的静态文件,可以相应的修改加入路径和引用路径。
no module named处理问题参考链接:
https://www.jianshu.com/p/bf07565f0090
https://www.cnblogs.com/jackadam/p/10342627.html