Подтвердить что ты не робот

Можно ли изменить Среду родительского процесса в Python?

В Linux Когда я вызываю python из оболочки, он реплицирует свою среду и запускает процесс python. Поэтому, если я делаю что-то вроде следующего:

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

Когда процесс python возвращается, FOO, предположив, что он был undefined изначально, по-прежнему будет undefined. Есть ли способ для процесса python (или любого дочернего процесса) изменить среду своего родительского процесса?

Я знаю, что вы обычно решаете эту проблему, используя что-то вроде

source script_name.sh

Но это противоречит другим требованиям, которые у меня есть.

4b9b3361

Ответ 1

Никакой процесс не может изменить родительский процесс (или любой другой существующий процесс).

Однако вы можете создать новую среду, создав новую интерактивную оболочку с измененной средой.

Вы должны создать новую копию оболочки, которая использует обновленную среду, и имеет доступ к существующим stdin, stdout и stderr, и делает свой танец повторной инициализации.

Вам нужно сделать что-то вроде использования subprocess.Popen для запуска /bin/bash -i.

Итак, исходная оболочка запускает Python, который запускает новую оболочку. Да, у вас много процессов. Нет, это не так уж плохо, потому что исходная оболочка и Python на самом деле ничего не делают, кроме как ждать завершения подоболочки, чтобы они также могли выйти.

Ответ 2

Невозможно, для любого дочернего процесса, изменить среду родительского процесса. Лучшее, что вы можете сделать, это вывести инструкции оболочки в stdout, которые вы затем используете, или записать их в файл, который вы используете в родительском.

Ответ 3

Я бы использовал инструкцию bash eval и вывел код python script код оболочки

child.py:

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

parent.sh

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