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

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

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

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

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

source script_name.sh

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

См. Этот связанный вопрос: stackoverflow.com/questions/205064/…

Davide 05.11.2008 01:20

Эндрю из этого потока ответил: Через gdb: (gdb) attach process_id (gdb) call putenv ("env_var_name = env_var_value") (gdb) detach Это довольно неприятный прием, и его следует выполнять только в контексте сценария отладки. курс.

grieve 06.11.2008 18:39
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
23
2
14 058
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

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

Ответ принят как подходящий

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

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

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

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

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

Да, это то, чем я сейчас занимаюсь. Я пытался избежать этого танца повторной инициализации.

grieve 05.11.2008 00:34

Я отредактировал ваш пост, исправив некоторые незначительные опечатки, и добавил комментарий в скобках (вы можете удалить его, если не согласны)

tzot 05.11.2008 14:44

Изменение «существующего» процесса - пока оно истинно - является касательным. Изменение родительского процесса - вот что всех смущает; людям непонятно, что все команды * nix выполняются в подпроцессе.

S.Lott 05.11.2008 14:56

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

child.py:

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

parent.sh

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

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