Как установить переменные оболочки в подпроцессе.Всплывающее окно (менее уродливым способом ...)

StackOverflow https://stackoverflow.com/questions/1845435

Вопрос

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top