Python 从完成的子进程中获取环境

Python get env from finished subprocess

python3.9

所以我有一个像这样的子流程


m_env = os.environ.copy()

process = subprocess.Popen(
    ['export', 'TEST=test'],
    env=m_env,
    stdout=subprocess.PIPE,
    stderr=subprocess.PIPE,
    shell=True
)
result = process.wait()

new_env = process.getenv() #how to get this so the new_env has the 'TEST=test' in it.

现在子进程本身正在修改环境,我想知道如何从进程中获取修改后的环境,示例使用导出,但是我 运行 一个脚本可能会更改或添加其他环境变量,所以我想得到整个环境。

你可以打印子进程中的所有环境变量shell,但你必须在之后解析数据。

import os
import subprocess

def main():
    m_env = os.environ.copy()
    process = subprocess.Popen(
        ['export TEST=test && export'],
        env=m_env,
        stdout=subprocess.PIPE,
        stderr=subprocess.PIPE,
        shell=True
    )
    process.wait()
    print(process.stdout.read()) # all environment variables


if __name__ == '__main__':
    main()

编辑:将环境打印函数从 printenv(在解析时可能有歧义)更改为 export。感谢Charles Duffy

@Pavel Hamerník 发布的解决方案是起点。在@Charles Duffy 的评论讨论指导下,以下解决方案最适合我的实施。

import os
import subprocess

def main():
    m_env = os.environ.copy()
    process = subprocess.Popen(
        ['/bin/bash', '-c', '. /path/script.sh && export > /tmp/env.txt'],
        env=m_env,
        stdout=subprocess.PIPE,
        stderr=subprocess.PIPE,
        shell=True
    )
    process.wait()
    print(process.stdout.read()) # read the stdout from script


if __name__ == '__main__':
    main()

注意:导出输出被定向到 /tmp/ 中的文件。