在使用python写好程序后,要将程序打包成exe文件,需要使用到pyinstaller包。但在pyinstaller的安装过程中会遇到各种问题,导致安装不成功或无法使用。
经历了多次安装失败,在查阅了各种方法后,最终解决了问题,并成功安装pyinstller。这里将安装过程进行描述,记录遇到的问题及解决方法。
1 安装pyinstaller
打开命令提示符,使用“pip install”命令安装pyinstaller:
pip install pyinstaller -i https://pypi.tuna.tsinghua.edu.cn/simple
这里使用了清华的镜像源。
运行结果如下图:
看到“Successfully installed...”的字样,可知已安装成功。
1.1 报错:“'pyinstaller' 不是内部或外部命令,也不是可运行的程序或批处理文件。”
使用“pyinstaller --version”命令查看是否安装成功:
提示“‘pyinstaller’不是内部或外部命令……” 。
查阅资料可知,在pyinstaller安装后,系统不会将其路径加入环境变量,需要手动添加。
其实,在上述安装成功界面的WARNING中可以看见,“... and pyinstaller.exe are installed in 'C:\Users\...\AppData\Roaming\Python\Python311\Scripts' which is not on PATH.”可知其安装路径,同时也提示,该路径未被加入到环境变量中。
于是手动将该安装路径加入到环境变量中。
1.2 报错:“The 'pathlib' package is an obsolete backport ... Please remove this package ... using conda remove ...”
将pyinstaller的安装路径加入环境变量后,再在命令提示符中使用“pyinstaller --version”命令,查看是否安装成功:
又报出错误:“The 'pathlib' package is an obsolete backport ... Please remove this package ...”
查阅资料可知,需要将pathlib包移除,因为该包与pyinstaller不兼容,因此要移除pathlib包。
根据有些博主的建议,在移除pathlib包的时候,尽量不要使用“conda remove pathlib”命令,应使用“pip uninstall pathlib”命令:
pip uninstall pathlib
1.3 报错:“PermissionError: [WinError 5] 拒绝访问。”
在卸载pathlib包的过程中,运行卸载命令后,结果如下:
报出“PermissionError: [WinError 5] 拒绝访问。” 的错误。
再试试“conda remove pathlib”命令(虽然有的博主不建议这么做,但还是想试一下):
报出“EnvironmentNotWritableError: The current user does not have write permission to the target environment.”的错误。可见当前用户不具有修改该文件的权限。
为了具有更高的权限,使用管理员身份运行命令提示符,然后再卸载pathlib包,即可成功。
运行结果如下:
看到“Successfully uninstalled pathlib-1.0.1”,可知pathlib已卸载成功。
再次以普通用户的身份打开命令提示符,使用“pyinstaller --version”命令查看:
看到了pyinstaller的版本(6.9.0),可知安装成功,并可以正常运行。
2 使用pyinstaller打包程序
2.1 程序准备
编写一个python程序,并将其命名为MyApp.py。:
from PyQt5.QtWidgets import QApplication, QWidget, QLabel
import sys
app = QApplication(sys.argv)
window = QWidget()
window.resize(400,300)
label = QLabel('Hello World!')
label.setStyleSheet('color: black; font-size: 40px; font-family: Arial;')
label.setParent(window)
window.show()
sys.exit(app.exec())
2.2 程序打包
打开命令提示符,切换到该python脚本所在的文件夹:
使用命令“pyinstaller MyApp.py”进行打包:
pyinstaller MyApp.py
待运行结束后,在MyApp.py脚本所在的文件夹下,除了MyApp.py脚本文件外,还看到新生成了若干文件和文件夹:
打开dist文件夹,再打开里面的MyApp文件夹,可以看到MyApp.exe文件,这就是生成的exe文件,双击运行后,结果如下:
程序成功运行 ,打包成功。
2.3 打包优化
对于打包生成的exe文件,其在运行过程中,总是先弹出命令行窗口,然后再弹出程序窗口;同时,在生成的文件夹中,包含了较多的dll等支撑文件。
如果不想先弹出命令行窗口,可在命令中加入“-w”选项(“w”要小写):
pyinstaller -w MyApp.py
待运行结束后,双击运行生成的exe文件,发现运行程序时不再弹出命令行窗口。
如果想只生成一个exe文件,而不想要那些支撑文件,可在命令中加入“-F”选项(此时生成的exe文件体积较大):
pyinstaller -w -F MyApp.py
待运行结束后,打开生成的dist文件夹,发现里面只有一个MyApp.exe文件,双击运行后,结果与上述结果相同。