PyInstaller 快速入门
1. 写在前面
PyInstaller简介
通过 PyInstaller,可以将 Python 脚本打包成 .exe
文件(适用于 Windows)或适用于 macOS和 Linux 的可执行文件,用户无需安装 Python 或任何相关依赖,便能直接运行程序。
主要优势:
- 将 Python 脚本打包成独立可执行文件,方便分发和运行。
- 支持单文件打包、图标定制、以及额外文件的捆绑。
- 可选隐藏控制台窗口,适合图形化应用(GUI)程序。
适用场景:
- 发布桌面工具或命令行程序。
- 让没有 Python 环境的用户也能使用你的工具。
- 分享自包含的 Python 项目,确保目标机器能够顺利运行。
PyInstaller github仓库地址为:https://github.com/pyinstaller/pyinstaller
PyInstaller 使用指南中文翻译的github仓库地址为:https://github.com/muziing/pyinstaller-docs-zh-cn
打包原理简述
pyinstaller先读取你需要打包的python文件,然后搜索其中使用的模块,然后将所需的模块以及Python解释器放到一起,并通过一些操作构建exe,最终形成你的应用程序。
当然,在搜索模块的时候可能会遇到一些问题。例如pyinstaller只会搜索import语句,然后根据import得到的模块再进行搜索。如果编程者使用了一些特殊的导入方式,比如使用\__import\_\_()函数,使用importlib里面的导入函数,那么pyinstaller很可能找不到你所需要的模块。
这时,你可以通过参数来指定你所需要的模块,也可以使用“HOOK钩子”等等。
打包效果概述
pyinstaller打包后会形成一个文件夹或单个的exe(可以用参数指定)。但不论是哪一种情况,都会包含一个exe文件,用户可以双击它运行该应用程序。
假如你要打包myscript.py,那么打包完成后运行这个myscript.exe,效果就是运行myscript.py后的效果。
默认情况下,打开打包后的程序,会打开一个黑色窗口的控制台(cmd的样子),可以通过打包命令中的参数控制显隐,默认会显示(如果不通过 input() 等待输入等手段控制,执行完程序,窗口会自动关闭),当你制作GUI程序的时候,可以选择隐藏控制台,来提升用户体验。
这个控制台用于为python提供标准输入(stdin),标准输出(stdout),标准错误(stderr)。也就是说,这个控制台上显示了print函数的输出,用于接收input函数的输入,还会输出python的异常。
如果你隐藏了这个控制台,程序中的print就无法显示(但是不会报错),报错信息也无法被用户直接看到(pyinstaller有一些选项来控制显示异常),需要注意的是,此时不能使用input,否则会报错:
RuntimeError: input(): lost sys.stdin
python文件有一种后缀名*.pyw,这样的程序执行时默认会隐藏控制台。如果将文件后缀命名为pyw,那么pyinstaller也会认为它隐藏了控制台,不需要通过额外的选项来指定。
直接打包后的文件会被反编译(即通过exe文件得到原来的代码),没有任何安全性,可以通过一些方法进行加密。
打包成单个文件夹
下面介绍一下打包完成后形成的文件夹。
这个文件夹的名字是你提供的,一般是你要求打包的python文件的名称。文件夹中包含一个exe文件,以及其他一些依赖文件(比如一些dll文件,可能还有你的应用所需要的图片等素材)。你只需要将该文件夹压缩就能发给别人运行了。
当你运行里面的exe文件后,pyinstaller其实只是启动了解释器,然后通过解释器运行你的主程序。
优点
打包成单个文件夹的形式便于调试,因为你可以清楚地看到pyinstaller将哪些模块文件放到了文件夹中。
当你更改代码,需要用户更新应用时,只需要让用户对于部分内容进行修改。如果你只修改了主程序,没有使用多余的模块,那么就只需要让用户替换里面的exe文件,而不用全部替换(因为更新前后使用的模块是一致的,它们都以多文件的形式放到了文件夹中)。
单个文件夹的状态下,程序的启动速度和打包前差不多。
缺点
打包成单个的文件夹后,文件大小可能会更大一些,因为大部分依赖文件没有进行压缩。
打包成单个exe
单个exe模式下,pyinstaller只会生成一个单独的exe文件,所有的依赖文件都会被压缩到exe文件中。
和上面的文件夹模式类似,exe启动后,pyinstaller也是通过调用python解释器来运行主程序的。
优点
启动单个exe非常简单,用户只需要点击exe文件就能运行,而无需在一大堆的依赖文件中找到exe文件。并且在经过压缩后,这个exe文件的文件大小会大大减小。
缺点
单个exe的启动速度比较慢(通常会慢几秒,且只是启动时的速度,不是运行后的速度),这是因为pyinstaller会在这一段时间中将一些依赖文件写入到一个临时的文件夹(后文介绍该文件夹的调用方式)。
如果你希望添加一些附带文件(比如使用说明README),你还需要额外新建文件夹并将其放进去。
2.打包基础教程
可视化界面打包
下面描述的这些命令行参数,对于用户来说并不友好,所以有热心网友开发了GUI工具(python包的形式),可以一键式配置,推荐使用:https://github.com/brentvollebregt/auto-py-to-exe
pip install auto-py-to-exe
auto-py-to-exe
A.打包生成内容
在项目根目录,打开命令行窗口执行命令:pyinstaller 项目入口函数
即可进行打包,主要生成以下三个内容(生成后,除了dist文件夹,其它都可以删除):
*.spec
文件:*.spec 文件是 PyInstaller 用于配置打包过程的脚本文件。每个 .spec 文件对应一个 Python 脚本,并包含了打包过程中所需的各种配置选项。通过编辑 .spec 文件,你可以自定义打包行为,例如指定额外的数据文件、隐藏导入模块、设置输出路径等。build/
文件夹:用于构建可执行文件,其中给出了该程序中间生成的一些东西。其中有一个文件提示了没有找到的库、被忽略的库等信息,但这只是作为一个参考。没找到会被忽略了,并不一定影响最后程序的运行,还要看最后exe的结果来说。dist/
文件夹:包含应用程序的所有依赖项和可执行文件,也就是打包后,最终生成的可以对外分享的内容。
B.打包常用参数
这只是一些常用的PyInstaller参数,实际上有更多选项可用于更复杂的定制。你可以使用pyinstaller --help
命令来查看完整的参数列表和说明。
参数名 | 简称 | 描述 |
---|---|---|
--onefile | -F | 将所有依赖文件打包为单个可执行文件。 |
--onedir | -D | 生成一个目录,包含多个文件。 |
--windowed 或`--noconsole` | -w | 隐藏控制台窗口(仅win下生效)。 |
--console | -c | 显示控制台(仅win下生效)。 |
--name | -m | 指定生成的可执行文件名称。 |
--add-data | 捆绑额外文件或文件夹(如配置文件、静态资源等)。<SRC;DEST or SRC:DEST> | |
--add-binary | 和--add-data类似,不过指定的文件夹或文件是二进制的。<SRC;DEST or SRC:DEST> | |
--path | -p | 提供一个路径进行搜索并且导入里面的模块(不同的路径使用路径分隔符os.pathsep分隔开,或者多次使用这个参数)。 |
--hidden-import | 手动添加隐藏的依赖模块(通常是自动检测遗漏的依赖)。需要进行额外导入的模块。当pyinstaller在程序中找不到一些模块时,需要你额外指定。这个参数可以多次使用,可以解决一些模块找不到的问题。指定需要手动导入但不在源代码中明确导入的模块。 | |
--icon | -i | 设置可执行文件的图标(需提供 .ico 文件)。 |
--upx-dir | 指定UPX可执行文件压缩工具的目录。 | |
--version-file | 指定版本信息文件 | |
--debug | -d | 提供debug输出。 |
--optimize | -O | 使用优化编译Python文件。 |
--noconfirm | 禁用优化编译确认提示。 | |
--help | -h | pyinstaller有很多参数,可以用-h或--help参数查看帮助 |
--noconfirm | 在覆盖现有输出目录时不进行确认。 | |
--clean | 清理之前的构建缓存,强制重新打包。 | |
--specpath | 指定spec文件的生成目录,默认为当前目录。 | |
--exclude-module | 排除某些模块。 | |
--python | 指定python解释器的路径。 | |
--splash IMAGE_FILE | 添加一个启动画面(图片文件)路径,在程序运行前显示指定的启动图片,起到加载提示的效果。 | |
--uac-admin | 启动打包后的程序时申请以管理员模式运行(仅Windows) |
C. 基础步骤
1. 安装 PyInstaller
在终端(或命令行)中运行以下命令,安装 PyInstaller,注意要装到对应的Python环境中:
pip install pyinstaller
2. 使用基础命令进行打包
假设你有一个 Python 脚本 example_script.py
,使用下面的命令将其打包为一个独立的可执行文件:
pyinstaller example_script.py
- 打包后,可以在
dist
目录下找到生成的可执行文件,其他文件可以删除不用。
D. 常见用法
示例 1:打包成单个EXE文件
将 example_script.py
所有依赖项和代码打包成一个单一的 .exe
文件
pyinstaller --onefile example_script.py
或者
pyinstaller -F example_script.py
示例 2:隐藏控制台窗口
适用于图形界面(GUI)应用程序,运行时隐藏控制台窗口
pyinstaller --onefile --noconsole gui_app.py
示例 3:自定义名称和图标
将输出文件命名为 my_program.exe
,并指定图标文件为 app.ico
pyinstaller --onefile --name=my_program --icon=app.ico example_script.py
示例 4:捆绑额外文件
将配置文件 config.yaml
一起捆绑进可执行文件:
pyinstaller --onefile --add-data "config.yaml;." example_script.py
注意:
- 路径问题:使用
--add-data
时,不同操作系统的路径分隔符需特别注意,在 Windows 系统中,路径分隔符用分号;
,而在 macOS/Linux中使用冒号:
- Windows:
"source;destination"
- macOS/Linux:
"source:destination"
再例如你的程序依赖于外部数据文件(如图片、配置文件等),你需要确保这些数据文件也被包含在内
pyinstaller --onefile --add-data "data;./data" example_script.py
这里,data;./data
意味着将当前目录下的data
文件夹及其内容添加到打包的EXE中,并在程序运行时作为./data
路径访问。
示例 5:解决控制台自动关闭问题
如果你想在程序运行时捕获并保持控制台窗口打开,可以在程序中添加一个暂停的操作,例如
input()
或raw_input()
。例如:if __name__ == '__main__': print("Press Enter to exit...") input()
另一种方法是使用
subprocess
模块启动一个新的控制台窗口来运行程序,这样程序运行结束后控制台不会自动关闭。例如:import subprocess import sys if __name__ == '__main__': subprocess.Popen([sys.executable, __file__], creationflags=subprocess.CREATE_NEW_CONSOLE)
示例 6:解决缺失依赖问题
如果在运行时遇到某个模块丢失的错误,可以通过 --hidden-import
指定手动引入依赖:
pyinstaller --hidden-import=requests example_script.py
E. 常见问题
1.打包的体积非常大
因为 pyinstaller 打包方法是将被打包的.py文件所处的虚拟环境中所有的数据(包)一起打包,所以可能导致打包成的exe程序非常大,因此可以另外单独为需要打包的软件创建一个虚拟环境,在新创的虚拟环境中只安装需要使用的包,从而缩小exe程序文件的大小。
另外,使用UPX压缩程序也是个好办法,把upx放到python环境的Script目录里时,打包会默认使用
(使用upx打包时间会长一些,个别场景下,upx可能会有dll丢失错误 )
UPX发布:https://upx.github.io/
3.96版本的win64版本下载地址:https://github.com/upx/upx/releases/download/v3.96/upx-3.96-win64.zip
打包体积问题是个经久不衰的题目,除了以上描述,还有非常多的方法,这里不再赘述,只列出来常见思路:
知乎讨论帖:https://www.zhihu.com/question/281858271
- 推荐使用Nuitka封装,不要使用pyinstaller https://nuitka-cn.com/
- 使用pip install fspacker完成打包,自动完成最小依赖发布 https://pypi.org/project/fspacker/
- 使用pip install soeasypack 来瘦身,获得最小依赖包 https://zhuanlan.zhihu.com/p/13398475275?utm_psn=1852841488821653504
- 使用更小的嵌入式 Python 版本来打包 https://www.zhihu.com/question/48776632/answer/2336654649
2.打包版本不正确
我在虚拟环境ven1里使用pyinstaller 为什么打包的Python版本不是ven1里面的?
最终原因发现,之前在虚拟环境安装pyinstaller的时候,似乎安装异常,只在lib下有pyinstaller。py,在scripts文件夹下没有pyinstaller.exe,打包时,要调用的是这个exe,重新安装一遍即可,或者使用如下方案:
1.使用绝对路径调用 pyinstaller
Windows:
D:\Code\PID\ven1\Scripts\pyinstaller.exe main.py
Linux/macOS:
/path/to/ven1/bin/pyinstaller main.py
2.通过指定 Python 解释器来运行 pyinstaller
,确保使用的是虚拟环境中的解释器。
通过指定 Python 解释器来运行 `pyinstaller`,确保使用的是虚拟环境中的解释器
python -m pyinstaller main.py
3.终端控制台输出带颜色字体
方式一 、通过ANSI转义码实现
# 输出红色文本示例
print("\033[91mHello, world!\033[0m")
# 输出绿色文本示例
print("\033[92mHello, world!\033[0m")
转义码 | 描述 |
---|---|
\033[0m | 关闭所有属性 |
\033[1m | 设置高亮单独 |
\033[2m | 设置一半亮度 |
\033[3m | 斜体 |
\033[4m | 下划线 |
\033[5m | 闪烁 |
\033[7m | 反显 |
\033[8m | 消隐 |
\033[30m | 设置前景色为黑色 |
\033[31m | 设置前景色为红色 |
\033[32m | 设置前景色为绿色 |
\033[33m | 设置前景色为黄色 |
\033[34m | 设置前景色为蓝色 |
\033[35m | 设置前景色为紫色 |
\033[36m | 设置前景色为青色 |
\033[37m | 设置前景色为白色 |
\033[40m | 设置背景色为黑色 |
\033[41m | 设置背景色为红色 |
\033[42m | 设置背景色为绿色 |
\033[43m | 设置背景色为黄色 |
\033[44m | 设置背景色为蓝色 |
\033[45m | 设置背景色为紫色 |
\033[46m | 设置背景色为青色 |
\033[47m | 设置背景色为白色 |
方式二、使用termcolor库
要在终端输出彩色文字,我们可以使用 termcolor 库中的 colored 方法。该方法需要传入两个参数:要输出的文字以及文字颜色。
pip install termcolor
from termcolor import colored
print(colored('Hello, World!', 'red'))
#执行上述代码,会在终端中输出红色的“Hello, World!”字样。
#如果要修改背景颜色,只需要在第二个参数中指定背景颜色即可。例如,下面的代码将输出红底白字的“Error!”字样:
print(colored('Error!', 'white', 'on_red'))
问题解决:Python 使用pyinstaller打包后,print打印颜色乱码
#代码如下,直接运行是正常的,使用pyinstaller打包后运行乱码
class bcolors:
OKRED = '\033[1;31m'
END = '\033[0m'
print(bcolors.OKRED+'红色字体'+bcolors.OKRED)
#添加如下代码即可解决:
import colorama
colorama.init(autoreset=True)
3.帮助文档 pyinstaller -h
位置参数:
scriptname 要处理的脚本文件名或确切的一个 .spec 文件。如果指定了 .spec 文件,大部分选项都是不必要的并且会被忽略。
选项:
-h, --help 显示此帮助信息并退出
-v, --version 显示程序版本信息并退出
--distpath DIR DIR是打包应用存放的位置(默认:./dist)
--workpath WORKPATH WORKPATH是所有临时工作文件(如.log.pyz等)存放的位置(默认:./build)
-y, --noconfirm 在不询问确认的情况下替换输出目录(默认:SPECPATH\dist\SPECNAME)
--upx-dir UPX_DIR UPX_DIR是UPX 工具的路径(默认:搜索执行路径)
--clean 在构建前清理 PyInstaller 缓存和移除临时文件。
--log-level LEVEL 构建时控制台消息的详细程度。LEVEL 可以是 TRACE, DEBUG, INFO, WARN, DEPRECATION, ERROR, FATAL 中的一个(默认:INFO)。也可以通过 PYI_LOG_LEVEL 环境变量设置并覆盖。
要生成什么:
-D, --onedir 创建一个包含可执行文件的单文件夹捆绑包(默认)
-F, --onefile 创建一个单文件捆绑的可执行文件。
--specpath DIR DIR是存放生成的 spec 文件的文件夹(默认:当前目录)
-n NAME, --name NAME NAME是为打包的应用和生成的spec文件分配的名称(默认:第一个脚本的基本名称)
--contents-directory CONTENTS_DIRECTORY
仅对于 onedir 构建,指定所有支持文件(即除了可执行文件本身之外的所有内容)将被放置的目录名称。使用 "." 重新启用没有内容目录的老 onedir 布局。
要捆绑什么,在哪里搜索:
--add-data SOURCE:DEST
要添加到应用程序的额外数据文件或包含数据文件的目录。参数值应该是 "源:目标目录" 的形式,其中源是要收集的文件(或目录)的路径,目标目录是相对于顶级应用目录的目标目录,两个路径用冒号(:)分隔。要将文件放在顶级应用目录中,使用 . 作为目标目录。这个选项可以多次使用。
--add-binary SOURCE:DEST
要添加到可执行文件的额外二进制文件。参见 ``--add-data`` 选项的格式。这个选项可以多次使用。
-p DIR, --paths DIR 搜索导入的路径(类似于使用 PYTHONPATH)。允许多个路径,用 ``';'`` 分隔,或者多次使用这个选项。等同于在 spec 文件中提供 ``pathex`` 参数。
--hidden-import MODULENAME, --hiddenimport MODULENAME
命名一个在脚本的代码中不可见的导入。这个选项可以多次使用。
--collect-submodules MODULENAME
从指定的包或模块中收集所有子模块。这个选项可以多次使用。
--collect-data MODULENAME, --collect-datas MODULENAME
从指定的包或模块中收集所有数据。这个选项可以多次使用。
--collect-binaries MODULENAME
从指定的包或模块中收集所有二进制文件。这个选项可以多次使用。
--collect-all MODULENAME
从指定的包或模块中收集所有子模块、数据文件和二进制文件。这个选项可以多次使用。
--copy-metadata PACKAGENAME
复制指定包的元数据。这个选项可以多次使用。
--recursive-copy-metadata PACKAGENAME
复制指定包及其所有依赖项的元数据。这个选项可以多次使用。
--additional-hooks-dir HOOKSPATH
额外的搜索钩子的路径。这个选项可以多次使用。
--runtime-hook RUNTIME_HOOKS
自定义运行时钩子文件的路径。运行时钩子是与可执行文件一起捆绑的代码,并在任何其他代码或模块执行之前执行以设置运行时环境的特殊功能。这个选项可以多次使用。
--exclude-module EXCLUDES
可选的模块或包(Python 名称,不是路径名称)将被忽略(就好像它没有找到)。这个选项可以多次使用。
--splash IMAGE_FILE (实验性)向应用程序添加带有 IMAGE_FILE 图片的启动画面。启动画面可以在解包时显示进度更新。
如何生成:
-d {all,imports,bootloader,noarchive}, --debug {all,imports,bootloader,noarchive}
为调试冻结应用提供帮助。这个参数可以多次提供以选择以下几个选项中的几个。
- all: 下面三个选项的全部。
- imports: 指定 -v 选项给底层 Python 解释器,导致它每次初始化模块时打印消息,显示它从哪里(文件名或内置模块)加载。详见
https://docs.python.org/3/using/cmdline.html##id4.
- bootloader: 告诉引导程序在初始化和启动捆绑的应用时发出进度消息。用于诊断缺少导入的问题。
- noarchive: 将所有冻结的 Python 源文件存储为结果可执行文件内部的归档,而不是将它们作为文件存储在结果输出目录中。
--optimize LEVEL 收集的 python 模块和脚本使用的字节码优化级别。详情见 PyInstaller 手册中的 “字节码优化级别” 部分。
--python-option PYTHON_OPTION
指定在运行时传递给 Python 解释器的命令行选项。当前支持 "v"(等同于 "--debug imports"),"u","W <警告控制>","X <xoption>" 和 "hash_seed=<值>"。详情见 PyInstaller 手册中的 “指定 Python 解释器选项” 部分。
-s, --strip 对可执行文件和共享库应用符号表剥离(Windows 不建议)
--noupx 即使可用也不使用 UPX(在 Windows 和 *nix 之间工作方式不同)
--upx-exclude FILE 在使用 upx 时防止二进制文件被压缩。这通常用于如果 upx 在压缩期间损坏某些二进制文件。FILE 是二进制文件的文件名,不带路径。这个选项可以多次使用。
Windows 和 Mac OS X 特定选项:
-c, --console, --nowindowed
打开控制台窗口进行标准 I/O(默认)。在 Windows 上,如果第一个脚本是 '.pyw' 文件,此选项无效。
-w, --windowed, --noconsole
Windows 和 Mac OS X:不提供控制台窗口进行标准 I/O。在 Mac OS 上,这也触发构建 Mac OS .app 捆绑包。在 Windows 上,如果第一个脚本是 '.pyw' 文件,此选项自动设置。在 *NIX 系统上忽略此选项。
--hide-console {minimize-late,hide-early,hide-late,minimize-early}
仅限 Windows:在控制台启用的可执行文件中,如果程序拥有控制台窗口(即,不是从现有控制台窗口启动的),引导程序自动隐藏或最小化控制台窗口。
-i <FILE.ico 或 FILE.exe,ID 或 FILE.icns 或 图片 或 "NONE">, --icon <FILE.ico 或 FILE.exe,ID 或 FILE.icns 或 图片 或 "NONE">
FILE.ico:将图标应用于 Windows 可执行文件。FILE.exe,ID:从 exe 中提取 ID 的图标。FILE.icns:将图标应用于 Mac OS 上的.app 捆绑包。如果输入的图片文件不是平台格式(Windows 上的 ico,Mac 上的 icns),PyInstaller 尝试使用 Pillow
将图标转换为正确的格式(如果安装了 Pillow)。使用 "NONE" 不应用任何图标,从而使 OS 显示一些默认图标(默认:应用 PyInstaller 的图标)。这个选项可以多次使用。
--disable-windowed-traceback
在窗口化(无控制台)模式下禁用未处理异常的 traceback 转储(仅限 Windows 和 macOS),并显示一条消息表明此功能已被禁用。
Windows 特定选项:
--version-file FILE 向 exe 添加 FILE 的版本资源。
--manifest <FILE 或 XML>
向 exe 添加 FILE 或 XML 清单。
-m <FILE 或 XML> --manifest 的过时简写。
-r RESOURCE, --resource RESOURCE
向 Windows 可执行文件添加或更新资源。RESOURCE 是一到四个项目,FILE[,TYPE[,NAME[,LANGUAGE]]]. FILE 可以是数据文件或 exe/dll。对于数据文件,至少必须指定 TYPE 和 NAME。LANGUAGE 默认为 0,也可以指定为通配符 * 以更新给定 TYPE 和 NAME 的所有资源。对于 exe/dll 文件,如果省略 TYPE,NAME 和 LANGUAGE 或指定为通配符 *,FILE 中的所有资源将被添加/更新到最终可执行文件中。这个选项可以多次使用。
--uac-admin 使用此选项会创建一个清单,将在应用程序启动时请求提升权限。
--uac-uiaccess 使用此选项允许提升的应用程序与远程桌面工作。
Mac OS 特定选项:
--argv-emulation 为 macOS 应用捆绑包启用 argv 仿真。如果启用,初始打开文档/URL 事件由引导程序处理,并且传递的文件路径或 URL 被追加到 sys.argv。
--osx-bundle-identifier BUNDLE_IDENTIFIER
Mac OS .app 捆绑包标识符用作代码签名目的的默认唯一程序名称。通常形式是反向 DNS 表示法的层次名称。例如:com.mycompany.department.appname(默认:第一个脚本的基本名称)
--target-architecture ARCH, --target-arch ARCH
目标架构(仅限 macOS;有效值:x86_64, arm64, universal2)。启用在 universal2 和冻结应用的单架构版本之间切换(提供的 Python 安装支持目标架构)。如果没有指定目标架构,将针对当前运行的架构。
--codesign-identity IDENTITY
代码签名身份(仅限 macOS)。使用提供的身份对收集的二进制文件和生成的可执行文件进行签名。如果未提供签名身份,则执行临时签名。
--osx-entitlements-file FILENAME
代码签名收集的二进制文件时使用的权限文件(仅限 macOS)。
很少使用的特殊选项:
--runtime-tmpdir PATH
在 onefile 模式下提取库和支持文件的位置。如果提供了这个选项,引导程序将忽略运行时操作系统定义的任何临时文件夹位置。_MEIxxxxxx 文件夹将在此位置创建。请仅在您知道自己在做什么时使用此选项。注意
在 POSIX 系统上,PyInstaller 的引导程序不对给定的路径字符串执行 shell 风格的环境变量扩展。因此,使用环境变量(例如,~ 或 $HOME)在路径中将不起作用。
--bootloader-ignore-signals
告诉引导程序忽略信号而不是将其转发给子进程。在例如一个监督进程同时向引导程序和子进程(例如,通过进程组)发送信号的情况下很有用,以避免两次向子进程发送信号。
跳出常规思维,角度独特,令人耳目一新。
?创新性评语?
作者的布局谋篇匠心独运,让读者在阅读中享受到了思维的乐趣。
?实用类评语?
作者的才华横溢,让这篇文章成为了一篇不可多得的艺术品。