为什么 python 的 Popen 无法在 Mac OS X 上传递环境变量?

Why does python's Popen fail to pass environment variables on Mac OS X?

我正在编写一个程序,需要生成一个新终端 window 并在这个新终端中启动一个服务器 window(将环境变量传递给子进程)。

我已经能够在 windows 10 和 linux 上轻松实现这一点,但是在 Mac OS X (Big Sur) 上环境变量不是传递给子进程。这是捕获我想要实现的行为的示例代码片段:

#!/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 标准库('subprocess' 模块)中的错误吗?

编辑 - 谢谢 Ben Paterson(之前我的示例代码有一个错误) - 我已经更新了代码示例,但我仍然遇到同样的问题。

编辑 - 我进一步缩小了范围。当我这样做时,subprocess.Popen 正在做它应该对环境变量做的事情:

command = "bash -c 'export > c.txt'"
process = subprocess.Popen(shlex.split(command, posix=1), env=env)

但是当我尝试用 osascript -e ... 包装命令时(在新终端中生成它 window),环境变量“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.updatereturnsNone,所以OP码相当于把env=None传递给subprocess.Popen。改为:

env = os.environ.copy()
env["MYVAR"] = "VAL"
subprocess.Popen(..., env=env)