Как установить переменные оболочки в subprocess.Popen (менее страшно ...) - PullRequest
0 голосов
/ 04 декабря 2009

ПРИМЕЧАНИЕ. Это , а не тот же вопрос, что и Python: постоянные переменные оболочки в подпроцессе , поскольку этот вопрос фактически касается переменных среды, а не переменных оболочки.

Я пытаюсь автоматизировать базовый тест, который я делаю в csh, с помощью встроенной в оболочку команды time. Вы можете настроить вывод time, установив переменную с тем же именем в оболочке следующим образом:

set time=(1000000000 "%U %S %E %P %W %X %D %K %M %F %R %I %O %r %s %k %w %c")

Однако это, конечно, не переменная среды, поэтому вы не можете передать ее в параметре env в конструкторе subprocess.Popen (я попробовал это сначала ...). Вы можете взломать его вместе, используя для этого (imo, во всяком случае) аргумент cmd, а затем свою реальную работу (сокращенно отображаемую):

time_cmd = 'set time=(1000000000 "%U %S %E %P %c"); time ./some_func'
p = subprocess.Popen(cmd, executable="/bin/csh", shell=True, ...)

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

Есть ли другой способ установить переменные оболочки в subprocess, кроме этого kludge?

1 Ответ

1 голос
/ 04 декабря 2009

У вас есть ограниченное количество опций для связи с дочерним процессом (аргументы вызова, среда и потоки). Поскольку установка переменной оболочки в более общем смысле изменяет внутреннее состояние дочернего процесса, то, что вы называете «kludge», на самом деле вполне разумно. Я не знаю ни одного варианта csh, в котором есть специальный способ загрузки переменных оболочки.

Тем не менее, вы можете исправить это, записав все свои команды инициализации в оболочку через канал или даже записав их в файл и прочитав их с помощью source встроенного в csh.

...