Связывание нескольких команд POPON с трубами

Я знаю, как запустить команду, используя cmd = subprocess.popen, а затем subcessess.comUnicate. Большую часть времени я использую строку, токеризующуюся с помощью Shlex.split в качестве аргумента «ARGV» для POPEN. Пример с «LS -L»:

import subprocess
import shlex
print subprocess.Popen(shlex.split(r'ls -l'), stdin = subprocess.PIPE, stdout = subprocess.PIPE, stderr = subprocess.PIPE).communicate()[0]

Однако трубы кажутся не работать ... Например, в следующем примере возвращается следующий пример:

import subprocess
import shlex
print subprocess.Popen(shlex.split(r'ls -l | sed "s/a/b/g"'), stdin = subprocess.PIPE, stdout = subprocess.PIPE, stderr = subprocess.PIPE).communicate()[0]

Можете ли вы сказать мне, что я делаю не так, пожалуйста,?

THX

26
задан 12 September 2011 в 14:43
поделиться

2 ответа

shlex только разделяет пробелы в соответствии с правилами оболочки, но не имеет дело с каналами.

Однако он должен работать следующим образом:

import subprocess
import shlex

sp_ls = subprocess.Popen(shlex.split(r'ls -l'), stdin = subprocess.PIPE, stdout = subprocess.PIPE, stderr = subprocess.PIPE)
sp_sed = subprocess.Popen(shlex.split(r'sed "s/a/b/g"'), stdin = sp_ls.stdout, stdout = subprocess.PIPE, stderr = subprocess.PIPE)
sp_ls.stdin.close() # makes it similiar to /dev/null
output = sp_ls.communicate()[0] # which makes you ignore any errors.
print output

в соответствии с help(subprocess)

Replacing shell pipe line
-------------------------
output=`dmesg | grep hda`
==>
p1 = Popen(["dmesg"], stdout=PIPE)
p2 = Popen(["grep", "hda"], stdin=p1.stdout, stdout=PIPE)
output = p2.communicate()[0]

HTH

2
ответ дан 28 November 2019 в 07:10
поделиться

Я думаю, что вы хотите создать два отдельных объекта Popen: один для «ls», а другой для «sed». Вы захотите передать атрибут stdout первого объекта Popen в качестве аргумента stdin второму объекту Popen.

Пример:

p1 = subprocess.Popen('ls ...', stdout=subprocess.PIPE)
p2 = subprocess.Popen('sed ...', stdin=p1.stdout, stdout=subprocess.PIPE)
print p2.communicate()

Вы можете продолжать цепочку таким образом, если у вас есть больше команд:

p3 = subprocess.Popen('prog', stdin=p2.stdout, ...)

См. Документацию подпроцесса для получения дополнительной информации о том, как работать с подпроцессами.

42
ответ дан 28 November 2019 в 07:10
поделиться
Другие вопросы по тегам:

Похожие вопросы: