在python传递双引号shell命令到subprocess.Popen()?(Passing do

2019-07-20 02:12发布

我一直在试图传递的壳工作的命令,只有与周围的命令行字面双引号作品"concat:file1|file2"的ffmpeg的说法。

然而,我不能让蟒蛇这项工作与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()

当我这样做,ffmpeg的不会把它比周围的CONCAT segement报价以外的任何其他方式。 有没有一种方法,以成功通过这条线subprocess.Popen的命令?

Answer 1:

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

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()


Answer 2:

这对Python 2.7.3管道标准错误到标准输出的命令,因为旧版本的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

阅读了手册上的子: http://docs.python.org/2/library/subprocess.html



Answer 3:

无论是使用单引号'around the "whole pattern"'自动躲避双打或明确"escape the \"double quotes\"" 。 你的问题有什么用做Popen这样。

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



Answer 4:

我一直与一个类似的问题,与通过SSH运行一个相对复杂的命令。 它也有multipel双引号和单引号。 因为我是通过管道将命令pythonsshpowershell

如果你能,而不是只是转换命令到一个shell脚本,并通过运行shell脚本subprocess.call/Popen/run ,这些问题就会迎刃而解。

所以,这取决于你是否在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)

而不必担心单引号等



Answer 5:

还用含有空格的字符串参数挣扎,不想用shell =真

解决的办法是使用双引号内的字符串。

args = ['salt', '-G', 'environment:DEV', 'grains.setvals', '{"man_version": "man-dev-2.3"}']

try:
    p = subprocess.Popen(args, stdin=subprocess.PIPE
                             , stdout=subprocess.PIPE
                             , stderr=subprocess.PIPE
                        )
    (stdin,stderr) = p.communicate()
except (subprocess.CalledProcessError, OSError ) as err:
    exit(1)
if p.returncode != 0:
    print("Failure in returncode of command:")


文章来源: Passing double quote shell commands in python to subprocess.Popen()?