【问题标题】:Python Subprocess Does not Get Environment Variable from Bat FilePython 子进程没有从 Bat 文件中获取环境变量
【发布时间】:2019-02-09 16:14:59
【问题描述】:

我有一个 bat 文件,其中设置了一些环境变量,例如

@echo off
SET MY_ENV_VAR=C:\temp

我想通过 Python 运行这个 bat 文件并运行其他依赖于这个环境变量 bat 集的可执行文件。但是即使bat文件运行,我也无法通过Python看到环境变量

subprocess.call(['path_to_bat_file\file.bat'], shell = False)
print(os.environ['MY_ENV_VAR'])

我尝试将 Shell 设置为 True 并添加我在互联网上找到的其他参数,但没有任何成功。它在 os.environ 上给出了 MY_ENV_VAR 未找到的 KeyError。当我在运行 python 脚本之前手动运行 bat 文件时,一切都按预期工作。

感谢任何帮助。

谢谢,

【问题讨论】:

  • 发生这种情况是因为您的subprocess.call() 设置了一个 进程。您在那里设置环境变量。批处理文件结束,进程终止。关联的环境消失。在您的代码的下一行中,您拥有 Python 解释器启动的环境。在运行 Python 代码之前运行 .bat 文件时,.bat 文件和 Python 代码都在同一进程中运行。相反,通过直接为 os.environ['MY_ENV_VAR'] 赋值来设置您的环境变量。
  • 我找不到在主线程中运行 bat 文件的方法。有可能吗?
  • 您不需要运行 .bat 文件来设置 Windows 环境变量。这很好,因为您不能在主线程中运行 .bat。
  • 我在主 bat 文件中有 150 个环境变量。我不想在 python 脚本中携带它们:)
  • 让脚本从 .bat 文件中读取它们。解析一堆SET 语句应该很容易。当然,除非它们相互引用,这会使其变得更加困难。

标签: python python-3.x subprocess


【解决方案1】:

无法从子进程更改您的环境。结束:)

但您可以在脚本中更改环境变量,例如,

import os
os.environ["MY_ENV_VAR"] = "C:\temp"

【讨论】:

  • 这个新的环境变量是否可以被父进程/脚本生成的子进程访问?
  • 是的。子级继承父级的环境变量。
猜你喜欢
  • 2021-12-07
  • 1970-01-01
  • 2021-02-17
  • 1970-01-01
  • 2019-11-27
  • 1970-01-01
  • 2022-01-22
  • 2017-03-06
  • 2019-07-10
相关资源
最近更新 更多