pyinstaller打包py程序

pyinstaller打包py程序

1. 基本语法

pyinstaller命令行的语法是:

pyinstaller [options] script [script …] | specfile

通常情况只需要将命令行移动到需要打包的脚本根目录下,然后运行:

pyinstaller会分析myscript.py脚本,并且:

  • 生成myscript.spec文件
  • 生成build目录,里面包含解析日志以及临时文件
  • 生成dist目录,里面包含最终输出的可执行文件(目录)

2. 常用参数

-D–onedir (默认)打包成一个包含可执行文件的目录
-F–onefile 打包成单个可执行文件
-n NAME–name NAME 定义输出的spec文件名以及打包后的程序文件名(默认为第一个script实参的文件名)
–add-data <SRC;DEST or SRC:DEST> 追加其他非.py文件,通常写在spec文件里面
–key KEY 使用KEY参数加密pyc文件
-c–console–nowindowed (默认)打开终端窗口
-w–windowed–noconsole 不打开终端窗口
-i FILE.ico, –icon FILE.ico 可执行文件的图标(注意.ico文件需要包含多种分辨率的图标,缺少的会自动使用pyinstaller图标)

3. spec文件用法

有些情况下,我们会需要修改spec文件,来生成完整的程序包。

  • 需要打包资源文件(pyinstaller默认只会打包.py文件
  • 需要打包一些pyinstaller无法找到的动态库
  • 为可执行程序添加运行时参数
  • 打包多个程序

生成spec文件的语法:

pyi-makespec options name.py [other scripts …]

通常用:

与目录解析相关的参数添加在Analysis对象中,与最终exe文件相关的参数添加在EXE对象中。以下图为例:

其中Analysis.datas参数表示要追加的文件或目录,该参数是一个二元组列表。每个二元组表示(源路径, 打包路径)。

EXE.console参数表示是否开启终端窗口,icon参数表示程序的图标,version参数表示windows程序的版本文件。

4. 添加版本信息

windows

先用pyinstaller自带的pyi-grab_version命令从已有的windows程序中获取一份版本信息样本文件。

然后修改成自己的版本信息。最后在打包的时候添加参数–version-file version_info.txt,或者写入spec文件中来打包。

 

mac os

 

5. 打包后程序运行失败怎么办?

程序编码时运行正常,打包后在本机运行正常,但是copy到别的电脑却无法运行,弹出错误窗口:“failed to execute script main”。我这次遇到的情况是打包后程序在别的电脑也能正常运行,但是加入windows启动运行后,每次系统自动启动的程序都是弹出运行错误无法启动,手工运行又是正常的。有什么办法能检查错误信息呢?

首先是打包的时候将终端窗口打开,但是由于程序是在启动时出错,所以这个dos窗口也直接闪退了,根本来不及看错误信息。想了想,应该在try…catch…一下main函数,把错误信息打印出来后sleep几秒,这样dos窗口就不会闪退啦。

重新打包,加入系统启动项,检查错误信息。发现还是由于一些静态文件路径找不到的问题。

原来windows系统启动项随机启动程序时,当前路径是在C:\Windows\system32,并不是程序所在目录。=。=#

解决这个路径问题的最好办法就是直接在main函数之前就

 

参考:

https://pyinstaller.readthedocs.io/en/stable/usage.html

发表评论

电子邮件地址不会被公开。 必填项已用*标注