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

问题描述

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

我已经能够在 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 ... 包装命令时(在新的终端窗口中生成它),环境变量“MYVAR”没有出现在 c.txt 文件中。

command = "bash -c 'export > c.txt'"
process = subprocess.Popen(['osascript',env=env)

解决方法

dict.update 返回 None,因此 OP 代码相当于将 env=None 传递给 subprocess.Popen。改写:

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