代码之家  ›  专栏  ›  技术社区  ›  grieve

可以在Python中更改父进程的环境吗?

  •  28
  • grieve  · 技术社区  · 17 年前

    在Linux中,当我从shell调用python时,它会复制其环境,并启动python进程。因此,如果我做以下事情:

    import os
    os.environ["FOO"] = "A_Value"
    

    当python进程返回时,假设FOO最初未定义,它仍然是未定义的。python进程(或任何子进程)是否有方法修改其父进程的环境?

    我知道你通常会用类似的东西来解决这个问题

    source script_name.sh
    

    但这与我的其他要求相冲突。

    4 回复  |  直到 6 年前
        1
  •  21
  •   tzot    17 年前

    任何进程都不能更改其父进程(或任何其他现有进程的环境)。

    但是,您可以通过使用修改后的环境创建新的交互式shell来创建新的环境。

    您必须生成一个新的shell副本,该副本使用升级的环境,可以访问现有的stdin、stdout和stderr,并进行重新初始化。

    您需要执行类似于使用subprocess的操作。Popen奔跑 /bin/bash -i .

    因此,原始shell运行Python,Python运行一个新的shell。是的,你有很多进程在运行。不,这还不算太糟糕,因为原始的shell和Python除了等待子shell完成外,并没有真正做任何事情,这样它们也可以干净地退出。

        2
  •  13
  •   Martin v. Löwis    17 年前

    对于任何子进程,都不可能更改父进程的环境。您能做的最好的事情是将shell语句输出到stdout,然后进行源代码生成,或者将其写入父级中的源文件。

        3
  •  12
  •   JimB    17 年前

    我会使用bash-eval语句,让python脚本输出shell代码

    child.py:

    #!/usr/bin/env python
    print 'FOO="A_Value"'
    

    parent.sh

    #!/bin/bash
    eval `./child.py`