PyInstaller常用打包命令
PyInstaller是一个第三方库,它能够在Windows、Linux、 Mac OS X 等操作系统下将 Python 源文件打包,通过对源文件打包, Python 程序可以在没有安装 Python 的环境中运行,也可以作为一个 独立文件方便传递和管理。
PyInstaller支持Python 2.7和Python 3.3+。可以在Windows、Mac OS X和Linux上使用,但是并不是跨平台的,而是说你要是希望打包成.exe文件,需要在Windows系统上运行PyInstaller进行打包工作;打包成mac app,需要在Mac OS上使用。
安装
pip install pyinstaller
2.1 注意
1.PyInstaller 库会自动将 PyInstaller 命令安装到 Python 解释器 目录中,与 pip 或 pip3 命令路径相同,因此可以直接使用。
2.Windows上运行PyInstaller还需要PyWin32或者pypiwin32,其中pypiwin32在你安装PyInstaller的时候会自动安装。
3. pyinstaller 打包命令的基本语法
pyinstaller [options] script[.py]
4. 常用命令说明
命令 说明
-h,–help 查看该模块的帮助信息
-F,-onefile 产生单个的可执行文件
-D,–onedir 产生一个目录(包含多个文件)作为可执行程序
-a,–ascii 不包含 Unicode 字符集支持
-d,–debug 产生 debug 版本的可执行文件
-w,–windowed,–noconsolc 指定程序运行时不显示命令行窗口(仅对 Windows 有效)
-c,–nowindowed,–console 指定使用命令行窗口运行程序(仅对 Windows 有效)
-o DIR,–out=DIR 指定 spec 文件的生成目录。如果没有指定,则默认使用当前目录来生成 spec 文件
-p DIR,–path=DIR 设置 Python 导入模块的路径(和设置 PYTHONPATH 环境变量的作用相似)。也可使用路径分隔符(Windows 使用分号,Linux 使用冒号)来分隔多个路径
-n NAME,–name=NAME 指定项目(产生的 spec)名字。如果省略该选项,那么第一个脚本的主文件名将作为 spec 的名字
5. 常用打包命令总结
命令 说明
pyinstaller -F xxx.py 打包一个exe
pyinstaller -F -w xxx.py 打包一个不带控制台的exe
pyinstaller -F -c xxx.py 打包一个带控制台的exe
pyinstaller -F -i xxx.ico xxx.py 打包一个指定图标的exe
可选参数
参数 解释
-h, --help 显示此帮助消息并退出
-v, --version 显示程序版本信息并退出。
–distpath DIR 将捆绑的应用放在何处(默认:./dist)
–workpath WORKPATH 放置所有临时工作文件的位置,.log、.pyz 等(默认:./build)
-y, --noconfirm 替换输出目录(默认:SPECPATH/dist/SPECNAME),而不要求确认
–upx-dir UPX_DIR UPX 实用程序的路径(默认:搜索执行路径)
-a, --ascii 不包括 Unicode 编码支持(默认:如果可用,则包括)
–clean 在构建之前清理 PyInstaller 缓存并删除临时文件。
–log-level LEVEL 构建时控制台消息中的详细信息量。级别可以是 TRACE、DEBUG、INFO、WARN、ERROR、CRITICAL(默认值:INFO)之一。
–uac-admin 添加管理员权限通过命令行的方式,例如pyinstaller -D -c --uac-admin main.py
生成结果参数
参数 解释
-D, --onedir 创建包含可执行文件的单文件夹捆绑包(默认)
-F, --onefile 创建单文件捆绑的可执行文件。
–specpath DIR 用于存储生成的 spec 文件的文件夹(默认:当前目录)
-n NAME, --name NAME 要分配给捆绑的应用程序和规范文件的名称(默认:第一个脚本的基本名称)
捆绑文件参数
参数 解释
–add-data <SRC;DEST or SRC:DEST> 要添加到可执行文件的其他非二进制文件或文件夹。路径分隔符是特定于平台的,(在Windows和大多数unix系统上)被使用。此选项可以多次使用。分隔符可选=、;、:或者空格
–add-binary <SRC;DEST or SRC:DEST> 要添加到可执行文件的其他二进制文件。有关更多详细信息,请参阅该选项。此选项可以多次使用。--add-data
-p DIR, --paths DIR 用于搜索导入的路径(如使用 PYTHONPATH)。允许使用多个路径、以 分隔或多次使用此选项。等效于在规范文件中提供参数。':'``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 名称,而不是路径名)(好像找不到它)。此选项可以多次使用。
–key KEY 用于加密 Python 字节码的密钥。需要安装pycrypto可以用pycryptodome代替
–splash IMAGE_FILE (实验性)将带有图像IMAGE_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 系统上被忽略。
-i <FILE.ico or FILE.exe,ID or FILE.icns or “NONE”>
--icon <FILE.ico or FILE.exe,ID or FILE.icns or “NONE”> 文件.ico:将图标应用于 Windows 可执行文件。文件.exe,ID:从exe中提取带有ID的图标。FILE.icns:将图标应用于 Mac OS 上的.app捆绑包。使用"NONE"不应用任何图标,从而使操作系统显示一些默认值(默认:应用 PyInstaller 的图标)
–disable-windowed-traceback 在窗口(无控制台)模式下禁用未处理异常的回溯转储(仅限 Windows 和 macOS),而是显示一条消息,指出此功能已禁用。
特定于窗口的选项
参数 解释
–version-file FILE 将版本资源从 FILE 添加到 exe。
-m
–manifest 将清单文件或 XML 添加到 exe。
–no-embed-manifest 生成外部.exe.manifest 文件,而不是将清单嵌入到 exe 中。仅适用于一进制模式;在单文件模式下,无论此选项如何,清单始终是嵌入的。
-r RESOURCE, --resource RESOURCE 将资源添加或更新到 Windows 可执行文件。资源是一到四个项目,FILE[,TYPE[,NAME[,LANGUAGE]]]。文件可以是数据文件或 exe/dll。对于数据文件,至少必须指定 TYPE 和 NAME。LANGUAGE 默认为 0 或指定为通配符 * 以更新给定 TYPE 和 NAME 的所有资源。对于 exe/dll 文件,如果省略了 TYPE、NAME 和 LANGUAGE 或指定为通配符 *,则 FILE 中的所有资源都将添加/更新到最终的可执行文件中。此选项可以多次使用。
–uac-admin 使用此选项将创建一个清单,该清单将在应用程序启动时请求提升。
–uac-uiaccess 使用此选项允许提升的应用程序使用远程桌面。
打包命令
执行打包命令生成单独的 .exe 程序
pyinstaller -F main.py
1
执行pyinstaller 提供的调试打包命令,查看打包错误日志,通过日志排查问题原因
-D 参数表示打调试包,将展示生成的各种依赖文件,等待打包结束,查看 build/main/warn-main.txt 日志警告文件
pyinstaller -D main.py
1
添加用户依赖包
分析日志发现缺失模块,现在通过命令行,把用户第三方依赖模块搜索路径添(请使用自己电脑定义的安装目录)加进打包命令,
下面提供示例,site-packages可以不用添加的,即如果你没有使用pip -target 安装第三方模块到自己指定的目录,这一步可以省略。有些IDE工具会创建自己的安装包路径,所以请添加IDE的安装包的路径
pyinstaller -D -p D:\\Python\\Python38\\Lib\\site-packages main.py
1
命令行打包多文件
pyinstaller [主文件] -p [其他文件1] -p [其他文件2]
--hidden-import [自建模块1]
--hidden-import [自建模块2]
# 以上为一整条命令
1
2
3
4
例如:pyinstaller -F start_menu.py -p check_default_speedup.py -p check_server_os.py -p check_speedup.py
通过upx减少体积
通过upx可显著见小程序体积。
需要下载upx.exe
gitgub下载
打包时加上以下参数:
--upx-dir UPX_DIR
1
UPX_DIR指向upx的下载目录不用具体到文件,一般建议直接和python解释器放在一起就好。pyinstaller会自动选择进行压缩(可写一个错误路径查看两次打的包大小)
使用spec方式
创建spec文件
打开终端进入项目路径下,输入指令: pyinstaller -makespec xxx.py,或者其他命令回车,程序结束后
当前目录(默认)下生成两个文件夹(bulid、dist)和一个文件start_menu.spec,现在删除两个文件夹,只保留start_menu.spec文件。
py文件打包配置
针对多目录多文件的python项目,打包时候需要将所有相关的py文件输入到Analysis类里。
Analysis类中的pathex定义了打包的主目录,对于在此目录下的py文件可以只写文件名不写路径。
spec脚本,将所有项目中的py文件路径以列表形式写入Analysis
资源文件打包配置
资源文件包括打包的python项目使用的相关文件,如图标文件,文本文件等。对于此类资源文件的打包需要设置Analysis的datas,
`datas接收元组:
datas写入必须是一对2元素元组,每一个元组代表一个文件。
元素第一个是要打包文件的路径(可用相对路径),第二个是要打包进exe后的路径(只能用相对路径以为./开头,根目录下的话可省略./)
datas=[('logo/icon.ico','./logo'),('image/xxx.png', 'image')]
1
Hidden import配置
pyinstaller在进行打包时,会解析打包的python文件,自动寻找py源文件的依赖模块。但是pyinstaller解析模块时可能会遗漏某些模块(not visible to the analysis phase),造成打包后执行程序时出现类似No Module named xxx。这时我们就需要在Analysis下hiddenimports中加入遗漏的模块
附:pyinstaller打包后运行报错
当使用PyInstaller打包Python程序后运行时遇到问题,可能的原因和解决方法包括:
- 磁盘空间不足。检查磁盘空间,尤其是系统盘,确保有足够的空间来运行程序。1
- 缺少模块。检查环境是否已安装所需包。如果没有,使用`pip install`命令安装。对于特定模块,如`mmcv`,需要在打包命令中添加`--hidden-import`参数。
- 文件路径问题。确保打包文件的路径中没有中文或空格。23
- 权限问题。检查文件是否被其他程序占用,或者是否被杀毒软件阻止。可能需要以管理员身份运行命令,或者关闭杀毒软件后再尝试打包。4
- 第三方库版本不匹配。确保Pyinstaller版本与Python和第三方库版本匹配。如果不匹配,尝试卸载并重新安装合适的版本。2
- 缺少依赖包。在PyCharm中,通过设置查看项目中使用的第三方库,并将这些库复制到打包时指定的路径中。5
- 隐藏导入问题。在打包命令中添加`--hidden-import`参数,指定需要隐藏导入的模块。16
- 系统文件缺失。检查系统文件,如`win32ctypes.pywintypes.error`,可能是由于系统文件缺失或损坏。6
如果上述方法都无法解决问题,可能需要考虑更换打包工具或检查系统环境。
用pyinstaller打包多个python文件及问题解决
python打包含有参数传递的exe程序
参考:https://blog.csdn.net/qq_40597070/article/details/130919514
https://www.jb51.net/python/3176774xh.htm
https://www.cnblogs.com/rxysg/p/17679940.html