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