Как установить переменные оболочки в subprocess.Popen (менее уродливым способом)

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

Я пытаюсь автоматизировать базовый тест, который я делаю в 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 (я попробовал это первым...). Вы можете взломать его вместе, злоупотребив (имо, во всяком случае) аргументом 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, кроме этого кладжа?


person Nick Bastin    schedule 04.12.2009    source источник


Ответы (1)


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

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

person p00ya    schedule 04.12.2009
comment
Это, вероятно, хороший способ взглянуть на это (к сожалению). Хотя большинство оболочек, похоже, имеют переменные оболочки, их поведение, несомненно, не регулируется POSIX так, как переменные среды. К сожалению, я не нашел подходящего волшебного соуса для связи с реальной оболочкой через канал. Это больше похоже на работу для pyexpect или пользовательского манипулирования tty, оба из которых менее привлекательны, чем мое существующее решение. :-) - person Nick Bastin; 04.12.2009