Можно ли изменить Среду родительского процесса в Python? - PullRequest
19 голосов
/ 04 ноября 2008

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

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

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

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

source script_name.sh

Но это противоречит другим моим требованиям.

Ответы [ 3 ]

18 голосов
/ 04 ноября 2008

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

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

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

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

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

13 голосов
/ 04 ноября 2008

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

12 голосов
/ 04 ноября 2008

Я бы использовал оператор bash eval, чтобы скрипт python выводил код оболочки

child.py:

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

parent.sh

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