我一直在尝试传递一个在shell中工作的命令,该命令仅适用于ffmpeg的"concat:file1|file2"
参数周围的命令行中的文字双引号。
然而,我无法使用subprocess.Popen()
从python中完成这项工作。任何人都知道如何将引号传递给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()
当我这样做时,除了concat segement周围的引号之外,ffmpeg不会采取任何其他方式。有没有办法成功将此行传递给subprocess.Popen命令?
答案 0 :(得分:40)
我建议使用调用的列表形式而不是引用的字符串版本:
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()
这更准确地表示将传递给最终过程的确切参数集,并且无需使用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()
答案 1 :(得分:5)
这适用于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
调用它:
python test.py
它打印我的主机名,即apollo:
apollo
答案 2 :(得分:4)
使用单引号'around the "whole pattern"'
自动转义双打或显式"escape the \"double quotes\""
。您的问题与Popen
无关。
仅仅是为了记录,我遇到了一个问题,特别是基于list
的命令传递给Popen
,不保持在glob模式周围的正确双引号(即在Windows下accepted answer)中的建议。在将列表传递给' '.join(cmd)
之前将其加入到Popen
的字符串中解决了问题。
答案 3 :(得分:2)
我一直在处理类似的问题,运行相对复杂
命令ssh。它还有多重双引号和单引号。因为
我通过python
,ssh
,powershell
等来管理命令。
如果您只需将命令转换为shell脚本,则运行
通过subprocess.call/Popen/run
的shell脚本,这些问题将会消失。
因此,根据您是在Windows上还是在Linux或Mac上,请放置
在shell脚本中跟随(script.sh
或script.bat
)
ffmpeg -i "concat:1.ts|2.ts" -vcodec copy -acodec copy temp.mp4
然后你可以运行
import subprocess; subprocess.call(`./script.sh`; shell=True)
无需担心单引号等
答案 4 :(得分:0)
还挣扎着包含空格且不希望使用 shell = True 的字符串参数。
解决方案是对内部字符串使用双引号。
<li class="active" (click) ="routeTransaction(), activateClass(classChange)" *ngIf="permissionKeys.indexOf('TRANSACTIONS')>-1" [ngClass]="{'liactive': classChange}" >
<a >
<i class="glyphicon glyphicon-cog"></i>
<span>Transaction</span>
</a>
</li>