Выполнять последовательные команды оболочки в Python -Подпроцесс - PullRequest
1 голос
/ 12 апреля 2020

Это некоторые зависимые команды, которые я пытаюсь запустить. Я ожидал, что изменит текущую папку на abc и список файлов.

Кроме того, после установки z=88 будет напечатано z.

import subprocess
cmd_list = []
cmd_list.append("cd ./abc")
cmd_list.append("ls")
cmd_list.append("export z=88")
cmd_list.append("echo $z")

my_env = os.environ.copy()
for cmd in cmd_list:
    sp = subprocess.Popen(cmd, stdin=subprocess.PIPE, stdout=subprocess.PIPE, stderr=subprocess.PIPE, env=my_env, shell=True,text=True)

Но невозможно получить вывод для ls и echo $z

1 Ответ

1 голос
/ 12 апреля 2020

Вы не можете сделать это с несколькими вызовами на subprocess.Popen(). Каждый вызов создает новый дочерний процесс, и изменения, которые они вносят в свою среду, не распространяются обратно на процесс Python.

Вы можете сделать это, объединив все команды в одну командную строку, которая будет выполняться bash -c.

cmd = 'cd abc; ls; export z=88; echo $z'
subprocess.Popen(['bash', '-c', cmd], stdin=subprocess.PIPE, stdout=subprocess.PIPE, stderr=subprocess.PIPE, env=my_env,text=True)

Также нет смысла экспортировать z, так как вы не запускаете дочерние процессы оболочки, которые используют переменную среды. Просто назначьте обычную переменную оболочки с z=88.

...