Запуск нескольких команд 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")
Ответы
Ответ 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 не обрабатывает ";"