如何在PyInstaller与Python应用中统一管理版本号
统一PyInstaller打包时的版本号管理方案
因为PyInstaller的版本资源文件(如file_version_info.py)是特定格式的配置文件,并非可执行的Python模块,所以无法直接导入其他Python文件复用版本号。以下是几种可行的统一管理方案:
方案1:用Python脚本自动生成版本资源文件
通过脚本读取统一版本文件的内容,自动生成符合PyInstaller要求的版本资源文件:
- 保留你的
version_info.py,定义版本常量:
# version_info.py MAJOR = 1 MINOR = 2 PATCH = 3 VERSION = f"{MAJOR}.{MINOR}.{PATCH}"
- 编写生成脚本
generate_version_info.py:
from version_info import MAJOR, MINOR, PATCH, VERSION # PyInstaller版本资源模板 template = ''' VSVersionInfo( ffi=FixedFileInfo( filevers=({MAJOR}, {MINOR}, {PATCH}, 0), prodvers=({MAJOR}, {MINOR}, {PATCH}, 0), mask=0x3f, flags=0x0, OS=0x40004, fileType=0x1, subtype=0x0, date=(0, 0) ), kids=[ StringFileInfo( [ StringTable( u'040904B0', [StringStruct(u'CompanyName', u'你的公司名'), StringStruct(u'FileDescription', u'你的应用描述'), StringStruct(u'FileVersion', u'{VERSION}'), StringStruct(u'ProductName', u'你的产品名'), StringStruct(u'ProductVersion', u'{VERSION}')]) ]), VarFileInfo([VarStruct(u'Translation', [1033, 1200])]) ] ) ''' # 填充模板并写入文件 with open('file_version_info.py', 'w', encoding='utf-8') as f: f.write(template.format(MAJOR=MAJOR, MINOR=MINOR, PATCH=PATCH, VERSION=VERSION))
- 打包前先执行脚本生成资源文件:
python generate_version_info.py - 用PyInstaller打包时指定该文件:
pyinstaller --version-file file_version_info.py your_app.py - 应用内部直接导入
version_info.py即可使用版本号。
方案2:在.spec文件中直接读取版本号
修改PyInstaller生成的.spec文件,直接从统一版本文件读取信息并配置:
- 先生成基础.spec文件:
pyinstaller your_app.py - 修改
your_app.spec,导入版本信息并配置到打包参数:
# your_app.spec from version_info import VERSION, MAJOR, MINOR, PATCH # 定义版本资源字典 version_config = { 'file_version': VERSION, 'product_version': VERSION, 'company_name': '你的公司名', 'file_description': '你的应用描述', 'product_name': '你的产品名' } a = Analysis( ['your_app.py'], # 保留其他默认参数 ) pyz = PYZ(a.pure, a.zipped_data) exe = EXE( pyz, a.scripts, a.binaries, a.zipfiles, a.datas, [], name='your_app', debug=False, strip=False, upx=True, console=True, # 按需改为False(无控制台窗口) version=version_config, # 传入版本配置 # 保留其他默认参数 )
- 用修改后的.spec文件打包:
pyinstaller your_app.spec - 应用内部依然通过
import version_info访问版本号。
方案3:将版本号定义在主模块/包的__init__.py中
如果你的项目是结构化包,可将版本号放在包的__init__.py:
# your_package/__init__.py __version__ = "1.2.3"
然后在.spec文件中导入包获取版本号,再按方案2的方式配置打包参数即可。
内容的提问来源于stack exchange,提问作者tinman
相关产品推荐
相关产品推荐

