【问题标题】:Why does python's Popen fail to pass environment variables on Mac OS X?为什么 python 的 Popen 在 Mac OS X 上无法传递环境变量?
【发布时间】: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


    【解决方案1】:

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

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

    【讨论】:

    • 感谢您的及时回复!我已经更新了代码示例以删除错误。对于那个很抱歉。但我仍然有同样的问题。我的实际代码中也没有犯同样的错误......你能在 Big Sur 的新终端中打印出MYVAR 吗?
    • briandfoy.github.io/… 似乎是罪魁祸首。
    • 谢谢看看。我把它缩小到这个:这有效:command = "bash -c 'export > c.txt'"process = subprocess.Popen(shlex.split(command, posix=1), env=env),但这不是:`command = "bash -c 'export > c.txt'"process = subprocess.Popen(['osascript', '-e', f"tell application \"Terminal\" to do script \"{command}\""], env=env)(请原谅错误的代码格式..但似乎这只是用包装命令时的问题osascript...
    • 我现在会接受您的回答,但在将环境变量传递给 osascript 调用时,我仍有一个未解决的问题。如果您知道如何做到这一点(或击败我弄清楚它),那将使您的最终答案完美而完整。谢谢。
    猜你喜欢
    • 2011-10-23
    • 2010-10-10
    • 2017-07-08
    • 2013-11-27
    • 2011-11-22
    • 2013-05-04
    相关资源
    最近更新 更多