我正在编写一个程序,该程序需要生成一个新的终端窗口并在此新的终端窗口中启动服务器(将环境变量传递给子进程)。
我已经能够在Windows 10和Linux上实现这一目标,而没有太多麻烦,但是在Mac OS X(大苏尔)上,环境变量没有传递给子进程。这是捕获我想要实现的行为的示例代码片段:
#!/usr/bin/python3
import subprocess
import os
command = "bash -c 'export'"
env = os.environ.copy()
env["MYVAR"] = "VAL"
process = subprocess.Popen(['osascript', '-e', f"tell application \"Terminal\" to do script \"{command}\""], env=env)
不幸的是,MYVAR
在导出的环境变量中不存在。
有什么想法,如果我在这里做错了吗?
这是python标准库(“子进程”模块)中的错误吗?
编辑-谢谢Ben Paterson(以前我的示例代码有一个错误)-我已经更新了代码示例,但仍然存在相同的问题。
编辑-我进一步缩小了范围。subprocess.Popen
在执行以下操作时应该执行的操作:
command = "bash -c 'export > c.txt'"
process = subprocess.Popen(shlex.split(command, posix=1), env=env)
但是,当我尝试使用osascript -e ...包装该命令(以在新的终端窗口中生成它)时,环境变量“ MYVAR”没有出现在c.txt
文件中。
command = "bash -c 'export > c.txt'"
process = subprocess.Popen(['osascript', '-e', f"tell application \"Terminal\" to do script \"{command}\""], env=env)
dict.update
返回None
,因此OP代码等效于传递env=None
给subprocess.Popen
。写:
env = os.environ.copy()
env["MYVAR"] = "VAL"
subprocess.Popen(..., env=env)
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句