前言
基本上所有程序都是要打包的,想要发给别人使用,如果直接发个脚本过去,还得检查Python环境这些,相对麻烦,打包后发个执行文件(exe/app)过去就很方便了。多文件打包是现实项目中比较常用的,一般我们写个脚本啥的,都会有依赖,本文就以Windows操作系统(macOS类似)为例,记录一下自己实操的过程。
一、示例工程
本文使用pyinstaller工具进行打包。拿一个简单的pyqt项目(纯代码,无资源文件)示例。
项目根目录
'main.py',
'E:\\workspace\\ui\\ALNMainWidget.py',
'E:\\workspace\\script\\ALNMain.py',
'E:\\workspace\\script\\converter\\Converter.py'
整个项目就由这几个py文件组成,output目录 属于非代码、非资源文件,不参与打包。
二、打包
方法一 修改打包配置文件spec
1、单文件打包
首先通过单文件打包的方式,将main.py打包一次,输出main.spec文件,这个文件,其实就是打包的配置文件,我们可以修改这个文件来达到自定义打包,本文也是通过该方式,进行多文件打包。
pyinstaller -F main.py
命令执行后,对应目录发生变化,可以看到,打包配置文件main.spec已经出现
2、修改main.spec打包配置文件
原始生成的文件内容
# -*- mode: python ; coding: utf-8 -*-
block_cipher = None
a = Analysis(['main.py'],
pathex=[],
binaries=[],
datas=[],
hiddenimports=[],
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,
[],
name='main',
debug=False,
bootloader_ignore_signals=False,
strip=False,
upx=True,
upx_exclude=[],
runtime_tmpdir=None,
console=True,
disable_windowed_traceback=False,
target_arch=None,
codesign_identity=None,
entitlements_file=None )
由于这里要将其余的py文件也打包,所以将其余py文件的路径,也写入到 a = Analysis()的第一个数组里面去,📢注意一点,路径可以使用相对路径或绝对路径,我个人推荐绝对路径。
# -*- mode: python ; coding: utf-8 -*-
block_cipher = None
a = Analysis(['main.py',
'E:\\workspace\\ui\\ALNMainWidget.py',
'E:\\workspace\\script\\ALNMain.py',
'E:\\workspace\\script\\converter\\Converter.py'],
pathex=[],
binaries=[],
datas=[],
hiddenimports=[],
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,
[],
name='main',
debug=False,
bootloader_ignore_signals=False,
strip=False,
upx=True,
upx_exclude=[],
runtime_tmpdir=None,
console=True,
disable_windowed_traceback=False,
target_arch=None,
codesign_identity=None,
entitlements_file=None )
📢📢另外一个注意点:实际上应该还有很多其他配置,这里没用到 暂时不深究,后续如果有用到再补充: - 1、纯代码文件,也就是.py文件,绝对/相对路径,写到 a -> Analysis -> 第一个[]里面。
方法二 使用-D参数打包
只跑一行命令,就可生成可执行文件exe,不过目录结构跟方法一有点不同,dist -> main -> main.exe,
同时该文件夹下会生成很多依赖文件。
pyinstaller -D main.py
方法三 使用-p参数打包
注意:macOS需要使用到这种方法,来打包出.app文件。
pyinstaller -w --clean -p {依赖包路径} {入口文件}.py
总结
双系统我都实操过了,基本上差不多,不复杂,一般小项目的话,可以直接使用方法三进行打包,如果项目依赖较多,或者打包配置较多的话,建议用方法一,自定义修改配置文件的方式进行打包。
至此,已完成多个py文件打包到一个exe里面了,在dist目录下,直接运行main.exe,开启梦幻之旅!!