Подтвердить что ты не робот

Запуск нескольких команд bash с подпроцессом

Если я запустил echo a; echo b в bash, результат будет состоять в том, что обе команды запущены. Однако, если я использую подпроцесс, тогда запускается первая команда, распечатывая всю остальную часть строки. Код ниже echos a; echo b вместо a b, как мне заставить его запускать обе команды?

import subprocess, shlex
def subprocess_cmd(command):
    process = subprocess.Popen(shlex.split(command), stdout=subprocess.PIPE)
    proc_stdout = process.communicate()[0].strip() 
    print proc_stdout

subprocess_cmd("echo a; echo b")
4b9b3361

Ответ 1

Вы должны использовать shell = True в подпроцессе и без shlex.split:

def subprocess_cmd(command):
    process = subprocess.Popen(command,stdout=subprocess.PIPE, shell=True)
    proc_stdout = process.communicate()[0].strip()
    print proc_stdout

subprocess_cmd('echo a; echo b')

возвращает:

a
b

Ответ 2

Я просто наткнулся на ситуацию, когда мне нужно было запустить кучу строк кода bash (не разделенных точкой с запятой) изнутри python. В этом случае предлагаемые решения не помогают. Один из подходов состоял в том, чтобы сохранить файл, а затем запустить его с помощью Popen, но в моей ситуации это было невозможно.

То, что я закончил, это что-то вроде:

commands = '''
echo "a"
echo "b"
echo "c"
echo "d"
'''

process = subprocess.Popen('/bin/bash', stdin=subprocess.PIPE, stdout=subprocess.PIPE)
out, err = process.communicate(commands)
print out

Итак, я сначала создаю дочерний процесс bash и после того, как я расскажу, что его выполнять. Этот подход устраняет ограничения на передачу команды непосредственно конструктору Popen.

Ответ 3

Присоедините команды с параметрами "&".

os.system('echo a > outputa.txt && echo b > outputb.txt')

Ответ 4

Если вы выполняете только команды одним выстрелом, вы можете просто использовать subprocess.check_output удобную функцию:

def subprocess_cmd(command):
    output = subprocess.check_output(command, shell=True)
    print output

Ответ 5

>>> command = "echo a; echo b"
>>> shlex.split(command);
    ['echo', 'a; echo', 'b']

поэтому проблема заключается в том, что модуль shlex не обрабатывает ";"