Python - Как вызвать команды Bash с трубы? - PullRequest
11 голосов
/ 06 сентября 2011

Я могу запустить это нормально в командной строке в Linux:

$ tar c my_dir | md5sum

Но когда я пытаюсь вызвать его с помощью Python, я получаю сообщение об ошибке:

>>> subprocess.Popen(['tar','-c','my_dir','|','md5sum'],shell=True)
<subprocess.Popen object at 0x26c0550>
>>> tar: You must specify one of the `-Acdtrux' or `--test-label'  options
Try `tar --help' or `tar --usage' for more information.

Ответы [ 4 ]

14 голосов
/ 06 сентября 2011

Вы должны использовать subprocess.PIPE, также, чтобы разделить команду, вы должны использовать shlex.split() для предотвращения странного поведения в некоторых случаях:

from subprocess import Popen, PIPE
from shlex import split
p1 = Popen(split("tar -c mydir"), stdout=PIPE)
p2 = Popen(split("md5sum"), stdin=p1.stdout)

Но чтобы создать архив и сгенерировать его контрольную сумму, вы должны использовать встроенные модули Python tarfile и hashlib вместо вызова команд оболочки.

4 голосов
/ 06 сентября 2011

Хорошо, я не уверен, почему, но, похоже, это работает:

subprocess.call("tar c my_dir | md5sum",shell=True)

Кто-нибудь знает, почему оригинальный код не работает?

2 голосов
/ 06 сентября 2011

На самом деле вы хотите запустить подпроцесс оболочки с командой оболочки в качестве параметра:

>>> subprocess.Popen(['sh', '-c', 'echo hi | md5sum'], stdout=subprocess.PIPE).communicate()
('764efa883dda1e11db47671c4a3bbd9e  -\n', None)
1 голос
/ 06 сентября 2011
>>> from subprocess import Popen,PIPE
>>> import hashlib
>>> proc = Popen(['tar','-c','/etc/hosts'], stdout=PIPE)
>>> stdout, stderr = proc.communicate()
>>> hashlib.md5(stdout).hexdigest()
'a13061c76e2c9366282412f455460889'
>>> 
...