2016-07-12 4 views
2

Я работаю над преобразованием старой системы пакетных файлов в python. Я столкнулся с пакетным файлом, который устанавливает переменные среды для командного файла, который его вызвал. Эти значения затем снова используются в будущих вызовах пакетных файлов. Кажется, что переменные среды меняют поток вызовов, но я не могу вернуть их обратно. Я прочитал здесь два разных потока, которые говорят о чем-то подобном, но это не совсем то же самое. Можно ли извлечь эти переменные среды из подпроцесса?Извлечь переменные среды из popen

Python subprocess/Popen with a modified environment

Set Environmental Variables in Python with Popen

Что я делаю сейчас:

p = Popen(process_, cwd=wd, stdout=PIPE, shell=True, 
      universal_newlines=True, stderr=STDOUT, env=env) 

старый поток летучих мышей файлов:

foo.bat calls foo-setparam.bat 
foo-setparam.bat sets some variables 
foo.bat uses these variables 
foo.bat calls bar.bat 
bar.bat uses variables set by both foo.bat and foo-setparam.bat 

Update: Я попытался добавить «вызов "перед моим параметром popen. У меня такое же поведение.

+0

Я не уверен, что вы подразумеваете под _a batch-файлом, который устанавливает переменные среды для командного файла, который называется it_. Подпроцесс не может изменить среду вызывающего процесса. В лучшем случае командный файл может возвращать некоторый вывод вызывающему, который вызывающий может проверить, а затем решить изменить его собственную среду. –

+0

Из моего понимания в .bat-файле команда вызова запускает целевой .bat-файл в той же среде. – Nickolouse

+2

Любой пакетный файл, который вызывается через 'call subprog.bat' И что _NOT_ содержит команду' setlocal', может изменять среду пакетного файла вызывающего абонента ... – Aacini

ответ

1

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

Это гораздо проще иметь сценарий питона написать временный файл, который содержит последовательность набора команд, как:

set VAR1=newvalue1 
set VAR2=newvalue2 

Затем измените вызывающие пакетный файл для вызова вашего питона скрипт, как:

python MyScript.py 
call MyScript_Env.cmd 
+0

К сожалению, я не могу изменить существующие пакетные файлы. – Nickolouse

+0

Извините, я неправильно понял, вам нужно увидеть переменные env из пакетного файла, который вызывается python? –

+0

Прошу прощения за длинный поворот. Я был снят с этой задачи некоторое время. Да Мне нужно получить доступ к переменным окружения в python, которые были установлены командным файлом, вызванным из того же скрипта python. – Nickolouse