【Python】pyinstaller:打包工具
pyinstaller:打包程序的工具,将python文件和所有依赖打包到文件夹、并生成可执行文件,也方便在其他电脑上使用程序。
官方文档:PyInstaller Manual — PyInstaller 6.15.0 documentation
安装:
pip install pyinstaller
打包程序:
pyinstaller py文件 各参数
常用参数:
--icon="ico图标路径" | 应用程序的图标 |
--add-data "源路径;目标路径" | 额外的文件一起打包到可执行文件中,也可在spec文件中配置 额外的文件在临时目录中。 |
--noconsole | 不显示控制台窗口 |
--onefile | 打包到一个独立的二进制文件,打包环境下sys._MEIPASS查看, 程序运行时生成临时目录,程序结束临时目录删除 |
--windowed | GUI项目(qt, tkinter)使用,否则会启用控制台 |
--workpath | 打包好的文件夹所在位置 |
--distpath | 可执行文件(windows为.exe)所在位置, 以及所有临时文件所在位置。 |
--specpath | 配置文件(.spec)所在位置 |
--hidden-import | 打包额外python库 |
--version | 查看pyinstaller版本信息 |
--help | 查看所有参数信息 |
注意:
默认打包后的文件夹保存在当前目录下,默认可执行文件和临时文件都在当前目录的dist目录下。
- 使用--workpath但没有使用--distpath:打包后的文件夹在指定路径,而dist目录(可执行文件)仍在当前目录下。
- 使用--onefile:dist目录下只有可执行文件没有临时文件。只在程序运行时生成临时目录(在其他路径)存放临时文件,程序结束则临时目录删除。
- 使用--onefile且使用--add-data:dist目录下只有可执行文件没有临时文件。打包到可执行文件中的额外文件,只在程序运行时存在于临时目录,可设置为永久存在。
- 使用--add-data "源路径;目标路径"但没有使用--onefile:(windows)中是分号";"隔开源路径和目标路径。额外文件都在dist目录下的临时目录中。可使用多个--add-data "源路径;目标路径"。
额外文件在程序中永久使用:
① 不使用--add-data参数,将文件拷贝到打包目录下,在程序中使用绝对路径读取。
② 使用--add-data参数,但不使用--onefile参数(该参数生成的临时目录会在程序结束时删除)。程序中读取文件的路径直接使用打包后的临时路径(sys._MEIPASS获取),默认和可执行文件在同一目录下。
③ 其他方法相对复杂此处忽略。
查看临时目录路径:
打包环境下sys._MEIPASS
# 注意相关模块的导入
def default_path(filename):'''获取打包程序的运行时临时目录路径'''if hasattr(sys, '_MEIPASS'):path = sys._MEIPASSelse:path = os.path.abspath(".")return path# 举例 1:读取文件的路径直接为打包后的临时目录
tmp_path = default_path('data.txt')
filename = os.path.join(tmp_path, 'data.txt')
with open(filename, 'r') as file:...# 举例 2:pyside2的状态栏显示打包后的临时目录路径
class mywindow(QMainWindow):...tmp_path = default_path('data.txt')self.statusbar.showMessage(f'程序运行时临时目录路径:{tmp_path}')...if __name__ == "__main__":...window = mywindow()window.show()...
打包举例:
# 不显示控制台窗口,打包到当前目录下,exe文件和临时文件都在当前目录的dist目录下
pyinstaller main.py --noconsole# 不显示控制台窗口,打包到当前目录下,exe文件和临时文件都在当前目录的dist目录下, 应用程序有图标
pyinstaller main.py --noconsole --ico="G:/do.ico"# 不显示控制台窗口,打包到当前目录下,只有exe文件在dist目录下,临时文件在程序运行时的临时目录(程序结束该目录删除),有图标
pyinstaller main.py --onefile --noconsole --ico="G:/do.ico"# 不显示控制台窗口,打包到当前目录下,只有exe文件在dist目录下,临时文件在程序运行时的临时目录(程序结束该目录删除),有图标,
# data.txt打包到exe文件中,程序运行时在临时目录中,程序结束目录删除,该文件也不存在,可设置永久存在
pyinstaller main.py --onefile --noconsole --ico="G:/do.ico" --add-data "data.txt;."# 不显示控制台窗口,打包到G:/aa目录下,exe文件和临时文件都在G:/aa/dist目录下,有图标
pyinstaller main.py --noconsole --ico="G:/do.ico" --workpath="G:/aa" --distpath "G:/aa/dist"# 不显示控制台窗口,打包到G:/aa目录下,exe文件在G:/aa/dist目录下,临时文件在程序运行时的临时目录(程序结束该目录删除),有图标
pyinstaller main.py --onefile --noconsole --ico="G:/do.ico" --workpath="G:/aa" --distpath "G:/aa/dist"# 不显示控制台窗口,打包到当前目录下,exe文件和临时文件都在当前目录的dist目录下,
# 两个额外文件都打包到可执行文件中,data.txt和do.ico都在dist目录下的临时目录中
pyinstaller main.py --noconsole --add-data "data.txt;." --add-data "do.ico;."