如何在PyInstaller打包时为Python脚本传入默认参数?
给PyInstaller打包的脚本注入构建时参数的方法
下面提供三种可行的方案,帮你在打包时给main.py传入默认参数,生成不同版本的可执行文件:
方法一:动态修改目标脚本的默认值
直接在打包前修改main.py里的默认参数定义,打包完成后可选择恢复原文件。
假设你的main.py里有默认密码的定义:
DEFAULT_PASSWORD = "default_value"
修改后的build.py:
import PyInstaller.__main__ import sys from sys import platform import fileinput import os def build_func(password): # 替换main.py中的默认密码 with fileinput.FileInput('main.py', inplace=True, backup='.bak') as f: for line in f: print(line.replace('DEFAULT_PASSWORD = "default_value"', f'DEFAULT_PASSWORD = "{password}"'), end='') # 执行打包逻辑 if platform in ("linux", "linux2"): PyInstaller.__main__.run([ 'main.py', '--onefile', '--windowed', '--add-data=picture.png:img' ]) elif platform == "win32": PyInstaller.__main__.run([ 'main.py', '--onefile', '--windowed', '--add-data=picture.png;img' ]) # 可选:恢复原main.py文件 os.replace('main.py.bak', 'main.py') if __name__ == "__main__": if len(sys.argv) < 2: print("请传入密码参数:python build.py <your_password>") sys.exit(1) build_func(sys.argv[1])
方法二:生成临时配置文件并打包进程序
构建时生成包含参数的配置文件,通过--add-data打包到可执行文件中,main.py运行时读取该文件。
修改后的build.py:
import PyInstaller.__main__ import sys from sys import platform import os def build_func(password): # 生成临时配置文件 with open('build_config.py', 'w') as f: f.write(f'DEFAULT_PASSWORD = "{password}"\n') # 配置文件的打包路径 add_data_config = 'build_config.py:.' if platform in ("linux", "linux2") else 'build_config.py;.' # 执行打包 if platform in ("linux", "linux2"): PyInstaller.__main__.run([ 'main.py', '--onefile', '--windowed', '--add-data=picture.png:img', f'--add-data={add_data_config}' ]) elif platform == "win32": PyInstaller.__main__.run([ 'main.py', '--onefile', '--windowed', '--add-data=picture.png;img', f'--add-data={add_data_config}' ]) # 删除临时配置文件 os.remove('build_config.py') if __name__ == "__main__": if len(sys.argv) < 2: print("请传入密码参数:python build.py <your_password>") sys.exit(1) build_func(sys.argv[1])
main.py中读取配置的代码:
import sys import os def get_resource_path(relative_path): try: # 打包后的临时目录路径 base_path = sys._MEIPASS except Exception: # 未打包时的当前目录 base_path = os.path.abspath(".") return os.path.join(base_path, relative_path) # 导入打包的配置文件 config_path = get_resource_path('build_config.py') sys.path.insert(0, os.path.dirname(config_path)) from build_config import DEFAULT_PASSWORD # 后续代码直接使用DEFAULT_PASSWORD即可
方法三:使用PyInstaller Runtime Hook
Runtime Hook是PyInstaller启动程序时优先执行的脚本,可用来注入全局变量。
- 创建
runtime_hook.py文件:
import os import main # 从构建时的环境变量获取密码,注入到main模块 main.DEFAULT_PASSWORD = os.environ.get('BUILD_PASSWORD', 'default')
- 修改后的
build.py:
import PyInstaller.__main__ import sys from sys import platform import os def build_func(password): # 设置构建时的环境变量 os.environ['BUILD_PASSWORD'] = password # 指定runtime hook脚本 hook_arg = '--runtime-hook=runtime_hook.py' # 执行打包 if platform in ("linux", "linux2"): PyInstaller.__main__.run([ 'main.py', '--onefile', '--windowed', '--add-data=picture.png:img', hook_arg ]) elif platform == "win32": PyInstaller.__main__.run([ 'main.py', '--onefile', '--windowed', '--add-data=picture.png;img', hook_arg ]) if __name__ == "__main__": if len(sys.argv) < 2: print("请传入密码参数:python build.py <your_password>") sys.exit(1) build_func(sys.argv[1])
main.py中直接使用变量:
# 初始化默认值,会被runtime hook覆盖 DEFAULT_PASSWORD = "default" # 后续代码使用该变量
内容的提问来源于stack exchange,提问作者lu3si
相关产品推荐
相关产品推荐

