python的打包工具pyinstaller的使用及问题解决

1. 安装

pip install pyinstaller

2. 使用

pyinstaller -F 打包的python文件名

输入参数的含义

常用参数

-F 表示生成单个可执行文件,适合单个脚本,如果你的代码都写在一个.py文件的话,可以用这个,如果是多个.py文件就别用
-D,pyinstaller会将python脚步打包成一个文件夹,运行程序时,需要进入该文件夹,点击运行相应的可执行程序,适合依赖比较多的项目
-w 表示去掉控制台窗口,这在GUI界面时非常有用。不过如果是命令行程序的话那就把这个选项删除吧!
-K (–tk)在部署时包含 TCL/TK
-p 表示你自己自定义需要加载的类路径,一般情况下用不到
-i 表示指定可执行文件的图标,但这个命令只在windows下生效,并且是ico格式的图片
-n 定义打包后文件的名称( 产生的 spec 后缀的文件)

不常用参数

-a, –ascii 不包含编码 . 在支持 Unicode的 python 版本上默认包含所有的编码
-d, –debug 产生 debug 版本的可执行文件
-c,(–nowindowed,–console)使用控制台子系统执行 ( 默认 )( 只对 Windows 有效 )例:

pyinstaller -c  xxxx.py
pyinstaller xxxx.py --console

-s,–strip 可执行文件和共享库将 run through strip. 注意 Cygwin的 strip 往往使普通的 win32 Dll 无法使用 .
-o DIR, –path=DIR 设置导入路径 ( 和使用 PYTHONPATH 效果相似 ). 可以用路径分割符 (Windows 使用分号 ,Linux 使用冒号 ) 分割 , 指定多个目录 . 也可以使用多个 -p 参数来设置多个导入路径,让pyinstaller自己去找程序需要的资源

第一步

pyinstall -i xxx.ico -n xxx -w -D main.py

1、在脚本目录生成 xxx.spec 文件(看-n参数,没传,则与xxx.py同名为xxx); 2、创建一个 build 目录; 3、写入一些日志文件和中间流程文件到 build 目录; 4、创建 dist 目录; 5、生成可执行文件或文件夹到 dist 目录,一般生成的可执行文件在这里,如果使用的是-F参数,就是直接在这里,如果使用的是-D参数,那就是在这个目录下还有一个目录,在这个目录里面;

效果如下:

在这里插入图片描述

第一步完成后,获得xxx.spec,然后再执行

pyinstaller xxx.spec

完成打包
进入dist中打包好的文件夹后,双脚运行可执行文件则可

spec文件解析

block_cipher =None
a =Analysis(['minimal.py'],
pathex=['/Developer/PItests/minimal'],
binaries=None,
datas=None,
hiddenimports=[],
hookspath=None,
runtime_hooks=None,
excludes=None,
ciper=block_cipher)
pyz = PYZ(a.pure, a.zipped_data,
cipher=block_cipher)
exe = EXE(pyz,...)
coll = COLLECT(...)
spec文件中主要包含4个class: Analysis, PYZ, EXE和COLLECT.

Analysis以py文件为输入,它会分析py文件的依赖模块,并生成相应的信息
PYZ是一个.pyz的压缩包,包含程序运行需要的所有依赖
EXE根据上面两项生成
COLLECT生成其他部分的输出文件夹,COLLECT也可以没有

PyInstaller自动生成的spec文件并不能满足我们的需求,最常见的情况就是我们的程序依赖我们本地的一些数据文件,这个时候就需要我们自己去编辑spec文件来添加数据文件了。 上面的spec文件解析中Analysis中的datas就是要添加到项目中的数据文件,我们可以编辑datas.

a =Analysis(
...
datas =[('you/source/file/path','file_name_in_project'),
('source/file2','file_name2')]
...
)

可以认为datas是一个List,每个元素是一个二元组。元组的第一个元素是你本地文件索引,第二个元素是拷贝到项目中之后的文件名字。除了上面那种写法,也可以将其提出来,变量

added_files =[...]
a =Analysis(
...
datas = added_files,
...
)
添加版本信息

前面的一系列操作后,软件可以用啦!但是呢没有版本信息啊。
这个好办,使用pyinstaller 内置的grab_version.exe 命令获取其他exe的版本文件,格式如pyi-grab_version c:/…/…/Postman.exe version_file_name.txt。
  获取到文件后复制到自己的项目根目录下,将里面的信息改写为自己的,在打包时使用“-v file=version_file_name.txt”参数将版本信息文件加入到即可。
注:文本中最后一行信息中的两个数字表明软件所属国家及语言:VarFileInfo([VarStruct(u’Translation’, [1033, 1200])])。

打包后的程序可以使用enigma virtual box工具封包,生成单独的*.exe文件

官网也有免费版 http://enigmaprotector.com/en/downloads.html
使用方法:
在这里插入图片描述

注意事项
1. 避免打包后,包文件过大

为了避免 pyinstaller 打包后程序或文件夹过大,如:几百kb的程序打包后编程500M左右的程序,在引用包时,尽量使用 from … import … 语句,这是因为pyinstaller打包的路径其实是将python解释器以及项目中使用的库直接复制过来,所以如果你没事就 import… ,那么pyinstaller会将整个模块复制过去,此时打出来的包就会很大

2. 考虑路径问题

使用python时,要养成使用 os.path.join 的习惯,这不仅可以避免跨平台的路径坑(windows路径表达与类Unix是不同),又可以在打包时不会出现相对路径的问题,很多python程序员编写路径喜欢使用 + 号来链接路径,这会增加项目的维护成本

pyinstaller 打包的项目遇到路径都使用 os.path.join 则可

3. 外部数据问题

虽然在上节中,提及了使用外部数据时,可以自定义 spec 文件中的 datas 字段,但我更常用的做法是直接将数据复制过去,不去修改datas。

比如我的项目中依赖 config 文件夹下的配置文件,执行将 config 文件夹整体直接复制到打包好的文件夹中则可,至于文件夹或者文件的位置问题,可以使用cmd窗口打开exe文件,会报文件位置的错误,它报哪里,就把文件放在哪里。

4. 闪屏结束

如果是简单的程序,可能会出现运行可执行程序后出现一闪而过的情况,这种情况下要么是程序运行结束(比如直接打印的 helloWorld),要么程序出现错误退出了。

这种情况要么通过 input() 函数捕捉输入自己主动结束程序,要么就在 cmd 下运行 exe 文件,从而通过 cmd 看到效果, 我就是在cmd下运行,这样可以看到报错,一般是依赖的文件或者文件夹没有放进来,按照提示的路径放进来就可以了

5. 缺少动态链接库

Qt自身的运行需要依赖特定的动态链接库,在没有装过Qt和python的计算机上运行pyqt程序会提示缺少必要的dll文件。缺少的文件位置在自己安装的pyqt目录下的QT里,文件夹名字为plugins。该文件下包含四个dll文件,为Qt运行所必须滴。这里给出我的文件地址供参考:C:…\PyQt5\Qt\plugins 。找到plugins文件后,将其复制一份到打包好的exe应用程序同目录下即可

我遇到的问题,我在打包后,打开exe文件,弹出窗口报错:failed to execute script XXX,其中这个XXX就是你打包的那个文件的名字

这种情况下,如果不是你的文件有问题的话,一般是你的PyQt5的版本过高,我此时用的是5.14版本的,太高了,我就卸载掉,pip安装的5.9.2版本,反正第一点,也可以试试5.10或者5.12等等,我用的是5.9.2打包后就可以了

  • 3
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值