【笔记】利用pyinstaller打包程序

简介

pyinstaller是一款非常好用的专门针对python程序的打包库,可以利用其方便地对python程序进行打包,然后分享给他人使用。

使用

-F:打包 Python 程序为单个可执行文件
-D:打包 Python 程序为一个文件夹
-i:生成图标,只适用于 Windows 平台
-n:指定打包后生成文件的名称
-w:禁止命令行弹出

常用使用示例:

pyinstaller -F xxx.py 
pyinstaller -D xxx.py
pyinstaller -i xxx.ico -n xxx -w -D xxx.py

注意:

  • -i 参数后接 .ico 结尾的图标文件。
  • -D 或 -F 后接 python 程序的主程序,也就是常见的 main.py。
  • 对于依赖比较多的程序,建议使用 -D。
  • 对于单文件的 py 脚本,建议使用-F。

基本原理

打包时,pyinstaller 此时会生成相应的 spec 文件,大体流程如下:

  • 在脚本目录生成 xxx.spec 文件 (取决于 -n 参数,没传,则与 xxx.py 同名为 xxx);
  • 创建一个 build 目录;
  • 写入一些日志文件和中间流程文件到 build 目录;
  • 创建 dist 目录;
  • 生成可执行文件或文件夹到 dist 目录;

此时,进入 dist 目录就可以看见自己的打包文件了,在这里,我使用的是-F的方式进行打包。

双击exe程序即可看到运行结果如下图:

程序运行结果

注意事项

Pyinstaller 是跨平台的,但并不是指其生成应用是跨平台的,而是 Pyinstaller 本身是跨平台的,在 Windows 平台下,可以打包出 exe 文件。

避免打包后,包文件过大

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

考虑路径问题

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

外部数据问题

使用外部数据时,可以自定义 spec 文件中的 datas 字段,具体流程如下所示:

  • 生成spec文件
pyi-makespec test.py 
  • 修改test.spec
block_cipher = None
a = Analysis(['test.py'],
             pathex=['/home/lixin/test'],
             binaries=[],
             datas=[('test.txt','.')], ## ---- 修改此处添加外部文件
             hiddenimports=[],
             hookspath=[],
             runtime_hooks=[],
             excludes=[],
             win_no_prefer_redirects=False,
             win_private_assemblies=False,
             cipher=block_cipher)
pyz = PYZ(a.pure, a.zipped_data,
             cipher=block_cipher)
exe = EXE(pyz,
          a.scripts,
          a.binaries,
          a.zipfiles,
          a.datas,
          name='test',
          debug=False,
          strip=False,
          upx=True,
          runtime_tmpdir=None,
          console=True )
  • 打包
pyinstaller test.spec

但我更常用的做法是直接将数据复制过去,不去修改 datas,比如我的项目中依赖 config 文件夹下的配置文件,执行将 config 文件夹整体直接复制到打包好的文件夹中则可。

闪屏结束

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

这种情况有如下几种解决方式:一是可以通过 input () 函数捕捉输入自己主动结束程序;二是可以在 cmd 下运行 exe 文件,从而通过 cmd 看到效果;三是可以在程序中加入如下代码:

import os
你的代码
os.system("pause")

参考资料

[1] https://mp.weixin.qq.com/s?src=11×tamp=1570861550&ver=1907&signature=q3H3jIxqsiRbS8BuZuCPzyFMQipG9xW6U0dRQ2iezAKUmALjci5iA2IbHT7FPZS-tvgEFdj2bjiHojx8HqHeFKrFGg036dQmxZ9elIo3Zj8xAyyd6UC0EkLihN88&new=1
[2] https://blog.csdn.net/m0_37477175/article/details/82146996

你可能感兴趣的:(【笔记】利用pyinstaller打包程序)