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

时间:2013-02-18 03:03:08

标签: python subprocess

我一直在尝试传递一个在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命令?

5 个答案:

答案 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

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

答案 2 :(得分:4)

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

仅仅是为了记录,我遇到了一个问题,特别是基于list的命令传递给Popen保持在glob模式周围的正确双引号(即在Windows下accepted answer)中的建议。在将列表传递给' '.join(cmd)之前将其加入到Popen的字符串中解决了问题。

答案 3 :(得分:2)

我一直在处理类似的问题,运行相对复杂 命令ssh。它还有多重双引号和单引号。因为 我通过pythonsshpowershell等来管理命令。

如果您只需将命令转换为shell脚本,则运行 通过subprocess.call/Popen/run的shell脚本,这些问题将会消失。

因此,根据您是在Windows上还是在Linux或Mac上,请放置 在shell脚本中跟随(script.shscript.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>
相关问题