将python中的双引号shell命令传递给subprocess.Popen()?

Fig*_*ire 43 python subprocess

我一直在尝试传递一个在shell中工作的命令,它只能在"concat:file1|file2"ffmpeg参数的命令行中使用文字双引号.

但我不能用python做这个工作subprocess.Popen().任何人都知道如何将引号传递给subprocess.Popen?

这是代码:

command = "ffmpeg -i "concat:1.ts|2.ts" -vcodec copy -acodec copy temp.mp4"

output,error = subprocess.Popen(command, universal_newlines=True,
stdout=subprocess.PIPE,
stderr=subprocess.PIPE).communicate()
Run Code Online (Sandbox Code Playgroud)

当我这样做时,除了在concat segement周围的引号之外,ffmpeg不会采取任何其他方式.有没有办法成功将此行传递给subprocess.Popen命令?

Amb*_*ber 42

我建议使用调用的列表形式而不是引用的字符串版本:

command = ["ffmpeg", "-i", "concat:1.ts|2.ts", "-vcodec", "copy",
           "-acodec", "copy", "temp.mp4"]
output,error  = subprocess.Popen(
                    command, universal_newlines=True,
                    stdout=subprocess.PIPE, stderr=subprocess.PIPE).communicate()
Run Code Online (Sandbox Code Playgroud)

这更准确地表示将传递给最终过程的确切参数集,并且无需使用shell引用.

也就是说,如果你绝对想要使用普通字符串版本,只需使用不同的引号(和shell=True):

command = 'ffmpeg -i "concat:1.ts|2.ts" -vcodec copy -acodec copy temp.mp4'
output,error  = subprocess.Popen(
                    command, universal_newlines=True, shell=True,
                    stdout=subprocess.PIPE, stderr=subprocess.PIPE).communicate()
Run Code Online (Sandbox Code Playgroud)

  • 在Unix上(至少),如果要传递字符串,则需要使用“ shell = True”。否则,据我了解,python将在您的路径中查找名为`ffmpeg -i“ concat ....”的程序-该程序将不存在。 (2认同)

j08*_*lue 9

要么使用单引号'around the "whole pattern"'自动转义双打或显式"escape the \"double quotes\"". 你的问题与此无关Popen

只是为了记录在案,我特别有问题list传递给基础的命令Popen,将不会保留周围的glob模式适当双引号(即什么是在建议接受的答案在Windows下)。' '.join(cmd)在传递它之前将列表加入一个字符串以Popen解决问题。

  • 这是对我有用的答案。我必须做`subprocess.run(" ".join(cmd), shell=True)` 才能让它工作。没有其他工作。 (2认同)

Eri*_*ski 6

这适用于python 2.7.3管道stderr到stdout的命令自旧版本的python以来已经改变:

把它放在一个名为test.py的文件中:

#!/usr/bin/python
import subprocess

command = 'php -r "echo gethostname();"'
p = subprocess.Popen(command, universal_newlines=True, shell=True, 
stdout=subprocess.PIPE, stderr=subprocess.STDOUT)
text = p.stdout.read()
retcode = p.wait()
print text
Run Code Online (Sandbox Code Playgroud)

调用它:

python test.py
Run Code Online (Sandbox Code Playgroud)

它打印我的主机名,这是apollo:

apollo
Run Code Online (Sandbox Code Playgroud)

阅读子流程手册:http: //docs.python.org/2/library/subprocess.html