【问题标题】:Retrieve environment variables from popen从 popen 检索环境变量
【发布时间】:2016-07-12 16:36:17
【问题描述】:

我正在努力将较旧的批处理文件系统转换为 python。我遇到了一个批处理文件,它为调用它的批处理文件设置环境变量。然后在将来对批处理文件的调用中再次使用这些值。我的环境变量似乎减少了调用流程,但我无法恢复它们。我在这里阅读了两个不同的主题,它们谈论类似但不完全相同的内容。是否可以从子进程中检索这些环境变量?

Python subprocess/Popen with a modified environment

Set Environmental Variables in Python with Popen

我现在在做什么:

p = Popen(process_, cwd=wd, stdout=PIPE, shell=True,
          universal_newlines=True, stderr=STDOUT, env=env)

bat文件的老流程:

foo.bat calls foo-setparam.bat
foo-setparam.bat sets some variables
foo.bat uses these variables
foo.bat calls bar.bat
bar.bat uses variables set by both foo.bat and foo-setparam.bat

更新: 我尝试在我的 popen 参数前添加“call”。我也有同样的行为。

【问题讨论】:

  • 我不确定您所说的为调用它的批处理文件设置环境变量的批处理文件是什么意思。子进程不可能改变调用进程的环境。一个批处理文件最多可以向调用者返回一些输出,调用者可以检查这些输出,然后决定改变自己的环境。
  • 根据我对 .bat 文件的理解,调用命令在同一环境中运行目标 .bat 文件。
  • 任何通过call subprog.bat 调用并且NOT 包含setlocal 命令的批处理文件都可以改变调用者批处理文件的环境...
  • 我没有意识到 call 正在被使用。我的错。
  • @JohnGordon 没问题。我更新了我的问题以更好地反映用例以帮助消除混淆。

标签: python windows python-3.x batch-file popen


【解决方案1】:

子进程通常不可能设置父环境变量,除非您想走一条有点邪恶的道路,在父进程中创建远程线程并使用该线程代表您设置变量。

让 python 脚本编写一个包含一系列 set 命令的临时文件要容易得多,例如:

set VAR1=newvalue1
set VAR2=newvalue2

然后修改调用批处理文件以调用你的python脚本,如:

python MyScript.py
call MyScript_Env.cmd

【讨论】:

  • 很遗憾我无法修改现有的批处理文件。
  • 对不起,我误会了,你需要从python调用的批处理文件中查看环境变量吗?
  • 很抱歉,长时间的转身,我暂时停止了这项任务。是的,我需要在 python 中访问由同一个 python 脚本调用的批处理文件设置的环境变量。
猜你喜欢
  • 2017-05-10
  • 2013-05-21
  • 1970-01-01
  • 2014-08-10
  • 1970-01-01
  • 1970-01-01
  • 2023-03-30
  • 2020-01-23
  • 2014-12-17
相关资源
最近更新 更多