1

Я создаю новый дочерний терминал и передавая его переменные окружения вызывающего Shell, используя:питон передать os.environ к ребенку гном-терминал

currentEnv =os.environ.copy() 
print("PARENT: " + currentEnv["PATH"]) 
subprocess.Popen(shlex.split("sudo gnome-terminal -x bash -c 'python3 somescript.py'"), env=currentEnv) 

внутри somescript.py Я сообщаю в $ PATH, задаваемой родитель:

currentEnv = os.environ.copy() 
print("CHILD:" + currentEnv["PATH"]) 

Мой выход в родительском терминала выглядит следующим образом:

PARENT: /usr/local/bin:/usr/bin:/bin:/usr/local/sbin:/usr/sbin:/sbin:/usr/local/lib:/home/myusername/bin 

в е е дочернее окно:

CHILD:/sbin:/bin:/usr/sbin:/usr/bin 

В результате, я получаю много «команда не найдена» ошибки в детском сценарии, когда он звонит в любых исполняемых файлов, найденных в родительском $ PATH.

Как передать переменные среды родителя в дочерний процесс? Я думал, что это поведение по умолчанию?

+2

Реальные процессы * do * наследуют среду родителя (включая 'PATH'). Ваша проблема в том, что 'sudo' специально ограничивает переменные среды, которые он передает * своим * детям (для обеспечения безопасности). –

+0

@AndrewMedico: вы должны опубликовать его в качестве ответа. Окружение наследуется даже без указания параметра env. 'sudo' является виновником. – jfs

+0

Спасибо за отзыв, похоже, что судо был главным виновником здесь - он также выделил некоторые проблемы в моих файлах ~./Bashrc и ~./Bash_profile, которые привели меня к решению. – sg90

ответ

2

Вы, вероятно, теряют переменные окружения при вызове sudo

Вы можете держать свои переменные окружения с Судом, используя -E переключатель:

Из инструкции:

-E, --preserve-env 

    Indicates to the security policy that the user wishes to preserve their existing environment variables. The security policy may 
    return an error if the user does not have permission to preserve the environment. 

Так попробуйте:

currentEnv =os.environ.copy() 
print("PARENT: " + currentEnv["PATH"]) 
subprocess.Popen(shlex.split("sudo -E gnome-terminal -x bash -c 'python3 somescript.py'"), env=currentEnv) 
+0

Спасибо за решение, осознав, что судо был виновником, я действительно нашел его излишним в моем случае. Запуск sudo gnome-terminal (или любого другого графического приложения с правами root) вызывает много головных болей. Я нашел дополнительную информацию об этом [здесь] (http://askubuntu.com/questions/515198/how-to-run-terminal-as-root) – sg90

Смежные вопросы