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

30 投票
4 回答
16940 浏览
提问于 2025-04-11 18:37

在Linux系统中,当我从命令行启动python时,它会复制当前的环境,然后开始运行python程序。因此,如果我做了如下操作:

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

当python程序结束后,假设FOO最开始是未定义的,它仍然会保持未定义的状态。有没有办法让python程序(或者任何子进程)去修改它的父进程的环境呢?

我知道通常可以用一些方法来解决这个问题,比如:

source script_name.sh

但是这和我其他的需求有冲突。

4 个回答

13

任何子进程都无法改变父进程的环境。这意味着子进程不能直接修改父进程的设置。你能做的最好的办法就是把一些命令输出到标准输出(stdout),然后在父进程中执行这些命令,或者把这些命令写入一个文件,然后在父进程中读取这个文件。

13

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

child.py:

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

parent.sh

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

一个进程是无法改变它的父进程(或者其他任何已经存在的进程)的环境。

不过,你可以通过创建一个新的交互式命令行来建立一个新的环境,这个新环境是经过修改的。

你需要启动一个新的命令行,这个命令行使用升级后的环境,并且可以访问现有的输入、输出和错误信息,同时还要进行一些初始化的操作。

你可以使用subprocess.Popen来运行 /bin/bash -i

所以,最开始的命令行运行Python,然后Python再启动一个新的命令行。没错,这样会有很多进程在运行。但其实也没什么大不了的,因为最开始的命令行和Python并没有做什么,只是在等着子命令行完成,这样它们才能干净利落地退出。

撰写回答