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

StackOverflow https://stackoverflow.com/questions/263005

  •  06-07-2019
  •  | 
  •  

Вопрос

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

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

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

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

source script_name.sh

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

Это было полезно?

Решение

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

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

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

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

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

Другие советы

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

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

child.py:

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

parent.sh

#!/bin/bash
eval `./child.py`
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top