pyinstaller模块打包文件成exe
Python文件打包成exe
官方文档 https://pyinstaller.org/en/stable/index.html
1,多个py文件
1,在"py文件所在目录"下cmd使用:pyi-makespec xxx.py
2,修改xxx.spec文件:加入需要打包的所有python文件,同时确保以下两项包含该项目的路径
a = Analysis(
['win_main.py','win_edit.py'], # 多个py文件
pathex=['D:\PyPublic\other_fun\v3'], # 根目录
...省略...
)
exe = EXE(
...省略...
console=False, # 隐藏执行exe时的命令窗口
icon='xxx.ico', # 自定义图标
)
3,执行 pyinstaller xxx.spec
4,生成dist文件,内有xxx.exe及各种依赖文件
2,单个py文件
1,文件的路径下,执行 pyinstaller -F xxx.py
2,更多选项
-D 默认选项,生成exe及其依赖,多个文件
-F 只生成单独一个exe 没有依赖文件
--key 123 指定加密密钥,需要pycrypto
-i xx.ico 指定图标
-w 执行exe时,隐藏cmd窗口
--add-data 其他文件/图片等
--add-binary 第三方模块
3,spec文件
3.1
先生成spec文件,配置后打包成exe,但是有依赖文件
3.2
使用-F选择直接打包成单个exe,自动生成的spec文件,无依赖文件
3.3 小结
spec文件模板
有无依赖文件最大区别在于,有无 coll = COLLECT() 选项,其次为 exe = EXE() 内配置变化
# -*- mode: python ; coding: utf-8 -*-
# block_cipher = pyi_crypto.PyiBlockCipher(key='12345')
block_cipher = None # 指定加密密钥,需要模块pycrypto
"""
added_files = [
( 'src/README.txt', '.' ),
( '/mygame/data', 'data' ), # 文件夹
( '/mygame/sfx/*.mp3', 'sfx' ) # 某类文件
]
"""
a = Analysis(
['win_main.py','win_edit.py'], # 第一个文件为主程序,其他文件为调用
pathex=['D:\PyPublic\other_fun\v1','D:\Virtualmenu\other_env\Lib\site-packages'], # 指定文件目录
# 建议将所需模块复制到当前文件夹,避免打包多余模块
binaries=[],
# datas = added_files,
datas=[], # 其他文件/图片等
hiddenimports=['openpyxl','et_xmlfile'], # 第三方模块,如果有则配置
hookspath=[],
hooksconfig={},
runtime_hooks=[],
excludes=[],
win_no_prefer_redirects=False,
win_private_assemblies=False,
cipher=block_cipher,
noarchive=False,
)
pyz = PYZ(a.pure, a.zipped_data, cipher=block_cipher)
exe = EXE(
pyz,
a.scripts,
a.binaries,
a.zipfiles,
a.datas,
[("csv.ico","./csv.ico","DATA")], # 自定义窗口左上角图标
# 程序配置为 main_win.iconbitmap(os.path.join('csv.ico'))
name='win_main', # 指定生成exe名字
debug=False,
bootloader_ignore_signals=False,
strip=False,
upx=True,
upx_exclude=[],
runtime_tmpdir=None,
console=False, # 执行exe时不显示cmd命令窗口
disable_windowed_traceback=False,
argv_emulation=False,
target_arch=None,
codesign_identity=None,
entitlements_file=None,
icon='xxx.ico', # 指定exe图标路径,无则删除该项
)
4,配置文件.spec
表格数据来源 https://blog.csdn.net/tangfreeze/article/details/112240342
变量 | 含义 |
---|---|
a | Analysis类的实例,要求传入各种脚本用于分析程序的导入和依赖。a中内容主要包括以下四部分:scripts,即可以在命令行中输入的Python脚本;pure,程序代码文件中的纯Python模块,包括程序的代码文件本身;binaries,程序代码文件中需要的非Python模块,包括–add-binary参数指定的内容;datas,非二进制文件,包括–add-data参数指定的内容。 |
pyz | PYZ的实例,是一个.pyz文件,包含了所有pure中的所有Python模块。 |
exe | EXE类的实例,这个类是用来处理Analysis和PYZ的结果的,也是用来生成最后的exe可执行程序。 |
coll | COLLECT类的实例,用于创建输出目录。在-F模式下,是没有COLLECT实例的,并且所有的脚本、模块和二进制文件都包含在了最终生成的exe文件中。 |
block_cipher | 加密密钥 |
参数 | 含义 |
---|---|
Analysis参数scripts | 也是第一个参数,它是一个脚本列表,可以传入多个py脚本,效果与命令行中指定多py文件相同,即py文件不止一个时,比如“pyinstaller xxx1.py xxx2.py”,pyinstaller会依次分析并执行,并把第一个py名称作为spec和dist文件下的文件夹和程序的名称 |
Analysis参数pathex | 默认有一个spec的目录,当我们的一些模块不在这个路径下,记得把用到的模块的路径添加到这个list变量里。同命令“-p DIR/–paths DIR”. |
Analysis参数datas | 作用是将本地文件打包时拷贝到目标路径下。datas是一个元素为元组的列表,每个元组有两个元素,都必须是字符串类型,元组的第一个元素为数据文件或文件夹,元组的第二个元素为运行时这些文件或文件夹的位置。例如:datas=[(’./src/a.txt’, ‘./dst’)],表示打包时将"./src/a.txt"文件添加(copy)到相对于exe目录下的dst目录中。也可以使用通配符:datas= [ (’/mygame/sfx/*.mp3’, ‘sfx’ ) ],表示将/mygame/sfx/目录下的所有.mp3文件都copy到sfx文件夹中。也可以添加整个文件夹:datas= [ (’/mygame/data’, ‘data’ ) ],表示将/mygame/data文件夹下所有的文件都copy到data文件夹下。同命令“–add-data”。 |
Analysis参数binaries | 添加二进制文件,也是一个列表,定义方式与datas参数一样。没具体使用过。同命令“–add-binary”。 |
Analysis参数hiddenimports | 指定脚本中需要隐式导入的模块,比如在__import__、imp.find_module()、exec、eval等语句中导入的模块,这些模块PyInstaller是找不到的,需要手动指定导入,这个选项可以使用多次。同命令“–hidden-import MODULENAME/–hiddenimport MODULENAME”。 |
Analysis参数hookspath | 指定额外hook文件(可以是py文件)的查找路径,这些文件的作用是在PyInstaller运行时改变一些Python或者其他库原有的函数或者变量的执行逻辑(并不会改变这些库本身的代码),以便能顺利的打包完成,这个选项可以使用多次。同命令“–additional-hooks-dir HOOKSPATH”。 |
Analysis参数runtime_hooks | 指定自定义的运行时hook文件路径(可以是py文件),在打好包的exe程序中,在运行这个exe程序时,指定的hook文件会在所有代码和模块之前运行,包括main文件,以满足一些运行环境的特殊要求,这个选项可以使用多次。同命令“–runtime-hook RUNTIME_HOOKS”。 |
Analysis参数excludes | 指定可以被忽略的可选的模块或包,因为某些模块只是PyInstaller根据自身的逻辑去查找的,这些模块对于exe程序本身并没有用到,但是在日志中还是会提示“module not found”,这种日志可以不用管,或者使用这个参数选项来指定不用导入,这个选项可以使用多次。同命令“–exclude-module EXCLUDES”。 |
exe参数console | 设置是否显示命令行窗口,同命令-w/-c。 |
exe参数icon | 设置程序图标,默认spec是没有的,需要手动添加,参数值就是图片路径的字符串。同命令“命令-i/–icon”。 |
tips:个人学习pyinstall总结
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 全程不用写代码,我用AI程序员写了一个飞机大战
· DeepSeek 开源周回顾「GitHub 热点速览」
· 记一次.NET内存居高不下排查解决与启示
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· .NET10 - 预览版1新功能体验(一)