Python PyInstaller打包教程:一键打包与高级.spec文件打包详解
个人用到时所写,如有补充、不足或问题,可以联系更改
使用pyinstaller直接打包,可能你引用的包或目录文件出现有但查找不到,没有这样的文件。我们就要去找文件改代码,看路径,很麻烦。这时候就可以使用.spec打包
**安装 PyInstaller**:如果你还没有安装 `PyInstaller`,你可以通过以下命令安装:
pip install pyinstaller
使用pyinstaller直接打包
pyinstaller -c -F user_name.py -i user_name.ico
列举几个常用命令:
-D, --onedir
生成一个目录,可执行程序。
-F, --onefile
生成单个可执行文件。
-c, --console, --nowindowed
为标准 i/o 打开一个控制台窗口(默认选项)。在 Windows 中,如果第一个脚本是 ‘.pyw’ 文件,则此选项无效。简称(带控制台)
-w, --windowed, --noconsole
不提供用于标准 i/o 的控制台窗口。在 macOS 上,这也会触发构建一个 .app 捆绑程序。在 Windows 系统中,如果第一个脚本是 ‘.pyw’ 文件,则会自动设置该选项。在 *NIX 系统上,该选项将被忽略。简称(不带控制台,gui界面上非常有用)
-n NAME, --name NAME
为捆绑的应用程序和 spec 文件指定的名称(默认值:第一个脚本的名称)。
–-i <FILE.ico or FILE.exe,ID or FILE.icns or Image or "NONE">, --icon <FILE.ico or FILE.exe,ID or FILE.icns or Image or "NONE">
FILE.ico:将图标应用于 Windows 可执行文件。FILE.exe,ID:从一个 exe 文件中提取带有 ID 的图标。FILE.icns:将图标应用到 macOS 的 .app 捆绑程序中。如果输入的图像文件不是对应平台的格式(Windows 为 ico,Mac 为 icns),PyInstaller 会尝试使用 Pillow 将图标翻译成正确的格式(如果安装了 Pillow)。使用 “NONE” 不应用任何图标,从而使操作系统显示默认图标(默认值:使用 PyInstaller 的图标)。该选项可多次使用。
可参考pyinstaller中文文档
使用 `PyInstaller` 生成 `.spec` 文件可以帮助你自定义打包过程。以下是如何生成 `.spec` 文件的步骤:
1. **生成 .spec 文件**:在命令行中进入你的 Python 脚本所在的目录,并运行以下命令(假设你的脚本名为 `your_script.py`):
pyinstaller –name=your_app_name –onefile –windowed your_script.py
– `–name`:指定生成的应用程序名称。
– `–onefile`:将所有文件打包成一个可执行文件。
– `–windowed`:在 Windows 上启动时隐藏命令行窗口(适用于 GUI 应用)。
上述命令会生成一个 `.spec` 文件(例如 `your_app_name.spec`)在当前目录。
2. **自定义 .spec 文件**:可以使用文本编辑器打开生成的 `.spec` 文件,进行一些自定义设置,比如:
– 添加数据文件(`datas`)
– 修改隐式导入(`hiddenimports`)
– 设置图标(`icon='your_icon.ico'`)
3. **使用 .spec 文件打包**:在修改 `.spec` 文件后,可以使用以下命令进行打包:
pyinstaller your_app_name.spec
通过这些步骤,你就能够生成并自定义 `.spec` 文件,用于控制打包过程。
自定义,如图:
block_cipher = None a = Analysis( ['执行文件名'], pathex=["C:\\Users\\user\\Desktop填写到项目文件的绝对路径"], binaries=[], datas=[ # 将同一目录的文件和其他需要的数据文件包括在内,如 (os.path.join("C:填写到项目文件的绝对路径", 'generate_img.py'), '.'), (os.path.join("C:填写到项目文件的绝对路径", 'wechat_auto'), 'wechat_auto'), (os.path.join("C:填写到项目文件的绝对路径", 'image.jpg'), '.'), (os.path.join("C:填写到项目文件的绝对路径", 'text_generate.md'), '.'), (os.path.join("C:填写到项目文件的绝对路径", 'ctrl_img.py'), '.'), (os.path.join("C:填写到项目文件的绝对路径", 'text_img.py'), '.'), (os.path.join("C:填写到项目文件的绝对路径", 'wechat_auto/__init__.py'), 'wechat_auto'), (os.path.join("C:填写到项目文件的绝对路径", 'wechat_auto/wechat_c_v.py'), 'wechat_auto') # 导入同一目录文件夹下的自定义函数 ], hiddenimports=[ 'wechat_auto/wechat_c_v','requests', 'urllib3' # 手动添加的模块名 ], hookspath=[], hooksconfig={}, runtime_hooks=[], excludes=[], cipher=block_cipher, noarchive=False, # 是否显示控制台(终端) ) pyz = PYZ(a.pure, a.zipped_data, cipher=block_cipher) exe = EXE( pyz, a.scripts, [], exclude_binaries=True, name='py_tkinter_gui', debug=False, bootloader_ignore_signals=False, strip=False, upx=True, upx_exclude=[], runtime_tmpdir=None, console=False, contents_directory='.' # 打包到同一目录下(没有就添加) ) coll = COLLECT( exe, a.binaries, a.zipfiles, a.datas, strip=False, upx=True, upx_exclude=[], name='执行文件名' )
作者:return_rebound