You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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启动程序时优先执行的脚本,可用来注入全局变量。

  1. 创建runtime_hook.py文件:
import os
import main

# 从构建时的环境变量获取密码,注入到main模块
main.DEFAULT_PASSWORD = os.environ.get('BUILD_PASSWORD', 'default')
  1. 修改后的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])
  1. main.py中直接使用变量:
# 初始化默认值,会被runtime hook覆盖
DEFAULT_PASSWORD = "default"

# 后续代码使用该变量

内容的提问来源于stack exchange,提问作者lu3si

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.17 09:50:26