Pyinstaller 打包常见用法和问题

安装

pip install --upgrade pyinstaller

安装最新开发版

pip install https://github.com/pyinstaller/pyinstaller/tarball/develop

验证安装

pyinstaller -v

结果应当输出类似与 3.x 或者 3.n.dev0-xxxxxx 的开发版本号

💊温馨提示

  1. 在虚拟环境下打包,只安装程序需要的依赖包,避免打包后文件过大(几百M)
  2. 在打包成单个 exe 文件之前,请先尝试打包成一个文件夹测试是否正常运行
  3. 打包成单个文件启动较慢,原因是程序需要按原目录结构解压到临时目录下,在用户目录下生成临时文件,结束后会自动删除

用法

基本用法

1. 直接打包

pyinstaller  myscript.py

2. 打包成单文件

pyinstaller -F myscript.py

3. 去掉控制台窗口,黑窗口

不显示控制台窗口(类似 cmd 的黑框框), 如果你写的是带 UI 的程序, 此选项基本必选.如果入口程序是 pyw 文件, 此选项默认生效.

pyinstaller -w myscript.py

4. 添加图标

pyinstaller -i icon.ico myscript.py

高级用法

打包一遍后,会生成一个xxx.spec文件, 是一个打包参数配置文件,该文件内容由上一次打包命令决定,可以通过添加打包参数重新生成,也可以可以直接修改其内容供下次使用。

😘 注: spec 文件生成方法

将 `pyinstaller` 命令换成 `pyi-makespec`

例:
```sh
pyi-makespec -F filename
```

💊 注:当你修改过 spec 文件并且想将其应用,你需要以下命令

```sh
pyinstaller ***.spec
```

1. 隐式导入

有些模块在代码里是动态加载的,比如通过 __import__(xxx) 或者 importlib 模块加载的,在打包过程中是无法检测出来的,但是不打包进去这些模块,程序会抛出 ModuleNotFoundError: No module named 'xxx' 异常,这时候你有两种方法解决。一是,在代码里显式地 import 这些模块,尽管你不去使用(pycharm 里显示灰色),二是在打包时添加打包参数,可以通过命令行参数,也可通过改 xxx.spec 配置文件。

命令行模式:

可以多次使用

–hidden-import MODULENAME1, --hiddenimport MODULENAME2

例:

--hidden-import docx --hidden-import Pillow
修改 spec 模式:

hiddenimports=[‘docx’],

例:

hiddenimports=['docx', 'Pillow']

2. 打包静态文件

当你程序中需要读取一些静态文件比如 setting.json ,就需要你将他们一起打包进去,否则 pyinstaller 也会忽略他们。

命令行模式

可以多次使用

--add-data <SRC;DEST or SRC:DEST>

👉 注意:格式为 一个原文件名和目标文件夹名!,中间用一个分号或者冒号分割。

👉 注意:路径中需要用 双反斜杠!!

例:
将原路径(绝对路径或者相对路径都可)setting 目录下的 aaa.json 文件打包到目标的 setting 文件夹下

--add-data ".\\setting\\aaa.json;.\\setting"

例:
将原路径(绝对路径或者相对路径都可)config 目录下的所有文件 文件打包到目标的 config 文件夹下

--add-data ".\\config\\*;.\\config"
修改 spec 模式
datas=[('.\\config\\*', '.\\config'),
('.\\setting\\aaa.json', '\\setting') ],
💊 注意事项

将文件打包成单文件时(但文件夹除外),你在程序中访问这些静态文件时切勿使用相对路径,因为单文件在运行时先解压所有需要的文件到 用户临时文件夹下( /temp 目录),并不在你当前运行路径下寻找这些静态文件。你需要将程序里访问这些静态文件的路径改为绝对路径,才能在其解压出的临时路径下找到他们:

if getattr(sys, 'frozen', None):
    basedir = sys._MEIPASS
else:
    basedir = os.path.dirname(__file__)

#接上例,打包进去的 aaa.json,加到了这个绝对目录。
aaa = os.path.join(basedir, 'setting', 'aaa.json')

👉 效果参考:

https://blog.csdn.net/Iv_zzy/article/details/107407167

3. 打包二进制依赖文件

将程序中依赖的 dll 或者 so 文件 一起打包进去。(编译好的 python 可调用模块或者 ctypes 加载的 dll 文件都可)

–add-binary <SRC;DEST or SRC:DEST>

可以多次使用;参数格式参考上一小标题(打包静态文件)

例:

--add-binary D:\\test\\pack\\HCNetSDK.dll;.\\lib

4. 加密字节码

详细介绍:https://pyinstaller.readthedocs.io/en/stable/usage.html#encrypting-python-bytecode

使用 --key 参数 指定一个长度为 16 的字符串,来加密 python 字节码文件,
你需要先执行以下命令

pip install pyinstaller[encryption]

然后

pyinstaller.exe --key=xxxx -F hellow.py

(🙏 过程可能不太顺利,过程慢长,打包完文件也较大)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值