Как вы обрабатываете трубы и вывод в Python?
Я пытаюсь выполнить эту команду в моем скрипте Python:
avprobeCommand = "avprobe -of json -show_streams {0} | grep '\"duration\"' | sed -n 1p | sed 's/ //g'".format(hiOutput)
output = subprocess.check_output([avprobeCommand])
и я продолжаю получать:
Traceback (most recent call last):
File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/threading.py", line 552, in __bootstrap_inner
self.run()
File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/threading.py", line 505, in run
self.__target(*self.__args, **self.__kwargs)
File "/Users/jmakaila/Documents/Development/Present/Web/video_dev/present-live-transcoder/Transcoder.py", line 60, in transcode
output = subprocess.check_output([avprobeCommand])
File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/subprocess.py", line 537, in check_output
process = Popen(stdout=PIPE, *popenargs, **kwargs)
File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/subprocess.py", line 679, in __init__
errread, errwrite)
File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/subprocess.py", line 1228, in _execute_child
raise child_exception
OSError: [Errno 2] No such file or directory
Я уже пытался разделить аргументы, но получаю ошибку для части -of json -show_streams, которая, для протокола, выглядела так:
subprocess.check_output(["avprobe", "-of json", "-show_streams", "{0}".format(hiOutput)
2 ответа
Решение
Передайте команду как строку и передайте shell=True
:
import pipes
import subprocess
avprobeCommand = """avprobe -of json -show_streams {0} | grep '"duration"' | sed -n 1p | sed 's/ //g'""".format(pipes.quote(hiOutput))
output = subprocess.check_output(avprobeCommand, shell=True)
ОБНОВЛЕНИЕ: аргумент должен быть экранирован с помощью pipes.quote
, (Использование shlex.quote
если вы используете Python 3.3+).
В вашем случае вы можете переместить постобработку в Python:
import json
from subprocess import check_output as qx
data = json.loads(qx(["avprobe", "-of", "json", "-show_streams", hiOutput]))
result = data["duration"] # grep '"duration"'
.partition("\n")[0] # sed -n 1p
.replace(" ", "") # sed 's/ //g'
Для более общего случая см. Как использовать subprocess.Popen для соединения нескольких процессов по каналам?