Python脚本执行Poetry命令时环境变量未生效,如何解决?
问题原因
你遇到的问题核心在于:每个subprocess.run()调用都会启动独立的shell进程,前一个进程里用export设置的环境变量,不会被后续进程继承,所以poetry run start根本看不到那些PARAM_*变量。
解决方案
方案1:把相关命令合并到同一个shell进程执行
将所有export命令和poetry run start放在同一个shell会话里执行,用&&或换行分隔,确保环境变量在同一个进程内生效:
import subprocess poetry_commands = [ "poetry install", "export PARAM_1=<value> && export PARAM_2=<value> && export PARAM_N=<value> && poetry run start" ] for command in poetry_commands: try: subprocess.run(command, shell=True, check=True) except subprocess.CalledProcessError as e: print(f"Command '{command}' failed with error code {e.returncode}")
也可以用多行字符串写得更清晰:
start_script = """ export PARAM_1=<value> export PARAM_2=<value> export PARAM_N=<value> poetry run start """ subprocess.run(start_script, shell=True, check=True)
方案2:通过subprocess的env参数直接传递环境变量
跳过shell的export,直接在调用subprocess.run()时,把自定义环境变量注入到进程环境中,这种方式更可控:
import subprocess import os # 复制当前系统的环境变量,避免覆盖原有变量 current_env = os.environ.copy() # 添加自定义参数 current_env["PARAM_1"] = "<value>" current_env["PARAM_2"] = "<value>" current_env["PARAM_N"] = "<value>" # 先执行安装 try: subprocess.run("poetry install", shell=True, check=True) except subprocess.CalledProcessError as e: print(f"Command 'poetry install' failed with error code {e.returncode}") # 带着自定义环境变量启动服务 try: subprocess.run("poetry run start", shell=True, check=True, env=current_env) except subprocess.CalledProcessError as e: print(f"Command 'poetry run start' failed with error code {e.returncode}")
方案3:用Poetry的.env文件管理环境变量(推荐)
在项目根目录创建.env文件,把环境变量直接写进去:
PARAM_1=<value> PARAM_2=<value> PARAM_N=<value>
Poetry 1.2及以上版本会自动加载这个文件的变量,你的脚本可以简化成:
import subprocess poetry_commands = [ "poetry install", "poetry run start" ] for command in poetry_commands: try: subprocess.run(command, shell=True, check=True) except subprocess.CalledProcessError as e: print(f"Command '{command}' failed with error code {e.returncode}")
这种方式符合Poetry的最佳实践,也方便后续统一维护环境变量。
内容的提问来源于stack exchange,提问作者Антон Георгиев
相关产品推荐
相关产品推荐

