在 Linux 中,当我从 shell 调用 python 时,它会复制其环境,并启动 python 进程。因此,如果我执行以下操作:
import os
os.environ["FOO"] = "A_Value"
当python进程返回时,FOO,假设它最初是未定义的,仍然是未定义的。python进程(或任何子进程)有没有办法修改其父进程的环境?
我知道你通常使用类似的东西来解决这个问题
source script_name.sh
但这与我的其他要求相冲突。
在 Linux 中,当我从 shell 调用 python 时,它会复制其环境,并启动 python 进程。因此,如果我执行以下操作:
import os
os.environ["FOO"] = "A_Value"
当python进程返回时,FOO,假设它最初是未定义的,仍然是未定义的。python进程(或任何子进程)有没有办法修改其父进程的环境?
我知道你通常使用类似的东西来解决这个问题
source script_name.sh
但这与我的其他要求相冲突。
没有进程可以更改其父进程(或任何其他现有进程的环境)。
但是,您可以通过使用修改后的环境创建新的交互式 shell 来创建新环境。
您必须生成一个新的 shell 副本,该副本使用升级后的环境并可以访问现有的标准输入、标准输出和标准错误,并进行重新初始化。
你需要做一些事情,比如使用 subprocess.Popen 来运行/bin/bash -i
。
所以原来的 shell 运行 Python,它运行一个新的 shell。是的,您有很多进程正在运行。不,这并不算太糟糕,因为原始的 shell 和 Python 并没有真正做任何事情,只是等待子 shell 完成,这样它们也可以干净地退出。
任何子进程都不可能改变父进程的环境。您可以做的最好的事情是将 shell 语句输出到标准输出,然后将其写入源文件,或者将其写入您在父文件中获取的文件。
我会使用 bash eval 语句,并让 python 脚本输出 shell 代码
孩子.py:
#!/usr/bin/env python
print 'FOO="A_Value"'
父.sh
#!/bin/bash
eval `./child.py`