【发布时间】:2021-04-04 13:22:33
【问题描述】:
我正在编写一个程序,它需要生成一个新的终端窗口并在这个新的终端窗口中启动一个服务器(将环境变量传递给子进程)。
我已经能够在 Windows 10 和 linux 上轻松实现这一点,但在 Mac OS X (Big Sur) 上,环境变量没有被传递给子进程。这是一个示例代码 sn-p 捕获我想要实现的行为:
#!/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', '-e', f"tell application \"Terminal\" to do script \"{command}\""], env=env)
【问题讨论】:
标签: python-3.x macos subprocess popen