В Linux. Когда я вызываю python из оболочки, он реплицирует свою среду и запускает процесс python. Поэтому, если я сделаю что-то вроде следующего:
import os
os.environ["FOO"] = "A_Value"
Когда процесс python возвращается, FOO, если он изначально был неопределенным, все равно будет неопределенным. Есть ли способ для процесса Python (или любого дочернего процесса) изменить среду своего родительского процесса?
Я знаю, что вы обычно решаете эту проблему, используя что-то вроде
source script_name.sh
Но это противоречит другим моим требованиям.
Эндрю из этого потока ответил: Через gdb: (gdb) attach process_id (gdb) call putenv ("env_var_name = env_var_value") (gdb) detach Это довольно неприятный прием, и его следует выполнять только в контексте сценария отладки. курс.






Ни один дочерний процесс не может изменить среду родительского процесса. Лучшее, что вы можете сделать, - это вывести операторы оболочки на стандартный вывод, который вы затем отправляете, или записать его в файл, исходный из родительского.
Ни один процесс не может изменить свой родительский процесс (или среду любого другого существующего процесса).
Однако вы можете создать новую среду, создав новую интерактивную оболочку с измененной средой.
Вы должны создать новую копию оболочки, которая использует обновленную среду и имеет доступ к существующим stdin, stdout и stderr, а также танцует свою переинициализацию.
Вам нужно сделать что-то вроде использования subprocess.Popen для запуска /bin/bash -i.
Итак, исходная оболочка запускает Python, который запускает новую оболочку. Да, у вас много запущенных процессов. Нет, это не так уж плохо, потому что исходная оболочка и Python на самом деле ничего не делают, кроме ожидания завершения подоболочки, чтобы они также могли чисто выйти.
Да, это то, чем я сейчас занимаюсь. Я пытался избежать этого танца повторной инициализации.
Я отредактировал ваш пост, исправив некоторые незначительные опечатки, и добавил комментарий в скобках (вы можете удалить его, если не согласны)
Изменение «существующего» процесса - пока оно истинно - является касательным. Изменение родительского процесса - вот что всех смущает; людям непонятно, что все команды * nix выполняются в подпроцессе.
Я бы использовал инструкцию bash eval, а сценарий python выводил бы код оболочки
child.py:
#!/usr/bin/env python
print 'FOO = "A_Value"'
parent.sh
#!/bin/bash
eval `./child.py`
См. Этот связанный вопрос: stackoverflow.com/questions/205064/…