如何使用subprocess.Popen设置变量并读取其内容?
如何通过subprocess.Popen在子进程间传递环境变量?
这个问题我之前也碰到过!核心原因是每个subprocess.Popen启动的shell都是独立的进程,你在p1里设置的var只在p1自己的shell会话里有效,p2是另一个全新的shell,根本看不到这个变量。下面给你两种可行的解决思路:
方法一:在同一个shell进程中执行所有命令
既然变量只在当前shell会话有效,那我们把设置变量和读取变量的命令放在同一个shell里执行就行,用&&连接两个命令(或者用换行分隔):
import subprocess # 将两个命令合并为一个,在同一个shell进程中执行 cmd = 'set var="something" && echo var %var%' p = subprocess.Popen(cmd, shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE) out, err = p.communicate() # Windows下shell默认编码是gbk,根据你的系统调整编码格式 print(out.decode('gbk'))
执行后就能得到预期的输出:var "something"
方法二:通过env参数传递环境变量
如果需要在多个独立的子进程间共享变量,更规范的方式是直接通过Popen的env参数传递环境变量,而不是在shell里用set命令:
import subprocess import os # 复制当前系统的环境变量字典,避免修改原环境 my_env = os.environ.copy() # 添加自定义的环境变量 my_env['var'] = 'something' # 在子进程中使用这个自定义环境 p = subprocess.Popen('echo var %var%', shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE, env=my_env) out, err = p.communicate() print(out.decode('gbk'))
这种方式更灵活,即使后续启动更多子进程,只要传递这个my_env就能共享变量。
为什么你的原代码不行?
再回头看你的代码:p1启动的shell设置完var后就退出了,这个变量是该shell进程的局部变量,不会影响其他进程;p2是全新启动的shell,它的环境和p1完全无关,自然解析不了%var%,所以输出了var %var%。
内容的提问来源于stack exchange,提问作者Mairkur
相关产品推荐
相关产品推荐

