Выполнение командных строк списка с подпроцессом popen и получение вывода - PullRequest
0 голосов

Я пытаюсь запустить несколько команд UNIX в скрипте Python, как этот

import subprocess


cmds = ['sleep 3', 'uptime','time ls -l /']


p = subprocess.Popen(cmds,stdout=subprocess.PIPE,shell=True)


while p.poll() is None:
    time.sleep(0.5)


tempdata = p.stdout.read()



print(tempdata)

Однако мой вывод не содержит весь вывод и, кажется, не выполняет все команды.Установка shell = False также вызывает ошибку.

Traceback (most recent call last):
  File "task1.py", line 32, in ?
    p = subprocess.Popen(commands,stdout=subprocess.PIPE,stderr=subprocess.PIPE,shell=False)
  File "/usr/lib64/python36/subprocess.py", line 550, in __init__
    errread, errwrite)
  File "/usr/lib64/python36/subprocess.py", line 996, in _execute_child
    raise child_exception
OSError: [Errno 2] No such file or directory

Ответы [ 3 ]

0 голосов
/ 26 мая 2018

Ваша проблема 'сон 3' вызывает ошибку, которую вы получаете от трассировки, когда я убрал, что она работала.

0 голосов
/ 26 мая 2018

Чтобы запустить все для них:

cmds = ['sleep 3', 'uptime','time ls -l /']

Вы должны вызвать popen для каждого из них:

for cmd in cmds:
    p = subprocess.Popen(cmd, stdout=subprocess.PIPE, shell=True)

    while p.poll() is None:
        time.sleep(0.5)

    output = p.stdout.read()

Или проще:

for cmd in cmds:
    output = subprocess.check_output(cmd, stdout=subprocess.PIPE, shell=True)

СекундаВопрос: Это захватывает весь вывод, записанный на стандартный вывод.Чтобы перехватить также stderr, перенаправьте его в subprocess.PIPE.

0 голосов
/ 26 мая 2018

Когда вы создаете новый процесс, вы не передаете ему список команд для запуска;скорее, вы передаете ей одну команду - либо в виде строки (с shell=True), либо в виде списка аргументов (с shell=False).

import subprocess

cmds = ['sleep 1', 'uptime', 'ls -l /']

for cmd in cmds:
    stdout = subprocess.check_output(cmd, shell=True)
    print('\n# {}'.format(cmd))
    print(stdout)

Если выпросто хочу собрать стандартный вывод, subprocess.check_output() может быть проще, чем Popen() - но любой из этих подходов будет работать, в зависимости от того, что вам нужно сделать с процессом.

...