Как установить переменные оболочки в подпроцессе.Всплывающее окно (менее уродливым способом ...)
-
12-09-2019 - |
Вопрос
ПРИМЕЧАНИЕ:Это не тот же вопрос , что и Питон:Постоянные переменные оболочки в подпроцессе, поскольку этот вопрос на самом деле касается переменных среды, а не переменных оболочки.
Я пытаюсь автоматизировать базовый бенчмарк, который я делаю в 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
кроме этого клуджа?
Решение
У вас есть ограниченное количество опций для связи с дочерним процессом (аргументы вызова, среда и потоки).Поскольку установка переменной оболочки в более общем смысле изменяет внутреннее состояние дочернего процесса, то, что вы называете "клуджем", на самом деле вполне разумно.Я не знаю ни о каких вариантах csh, у которых есть специальный способ загрузки переменных оболочки.
Однако вы могли бы усовершенствовать его, записав все свои команды инициализации в оболочку через канал или даже записав их в файл и прочитав их csh source
встроенный.