带引号的Python子进程参数

时间:2014-03-13 10:54:05

标签: python subprocess

我正在尝试从python运行http://mediaarea.net/en/MediaInfo命令行实用程序。 它接受这样的论点。

* 简单用法:*

# verbose all info
MediaInfo.exe test.mp4 

模板使用:

# verbose selected info from csv    
MediaInfo.exe --inform="file://D:\path\to\csv\template.csv" test.mp4 

我正在尝试使用Template参数运行它。我可以从CMD成功使用上面的命令。它正在工作,我可以从Dos窗口看到我选择的输出正常。

但是当我尝试从python运行它时,它会输出忽略CSV的所有信息,我将其作为参数提供。 有谁能解释为什么?这是因为引用?

注意:如果csv的路径不正确/无效csv,MediaInfo将完全输出此处发生的所有信息。

#App variable is full path to MediaInfo.exe
#filename variable is full path to media file

proc  =  subprocess.Popen([App ,'--inform="file://D:\path\to\csv\template.csv"',filename],shell=True,stderr=subprocess.PIPE, stdout=subprocess.PIPE) 
return_code = proc.wait()
for line in proc.stdout:
    print line

2 个答案:

答案 0 :(得分:1)

在Windows上,您可以将命令作为字符串传递,即:

from subprocess import check_output

cmd = r'MediaInfo.exe --inform="file://D:\path\to\csv\template.csv" test.mp4'
out = check_output(cmd)

注意:r'' - 原始字符串文字用于避免将'\t'解释为单个制表符而不是r'\t'两个字符(反斜杠和t

无关:如果您已指定stdout=PIPE, stderr=PIPE,那么在 p.wait()之前,您应该同时阅读两个否则,如果命令生成足够的输出,则可能出现死锁。


如果将命令作为字符串传递,则可以尝试列表参数:

from subprocess import check_output
from urllib import pathname2url

cmd = [app, '--inform']
cmd += ['file:' + pathname2url(r'D:\path\to\csv\template.csv')]
cmd += [filename]
out = check_output(cmd)

  

你也可以为你提到的p.wait()死锁写一个例子。

很容易。只需在子进程中生成大量输出:

import sys
from subprocess import Popen, PIPE

#XXX DO NOT USE, IT DEADLOCKS
p = Popen([sys.executable, "-c", "print('.' * (1 << 23))"], stdout=PIPE)
p.wait() # <-- this never returns unless the pipe buffer is larger than (1<<23)
assert 0 # unreachable

答案 1 :(得分:0)

如果你print你的论点,你可能会看到出了什么问题:

>>> print '--inform="file://D:\path\to\csv\template.csv"'
--inform="file://D:\path    o\csv   emplate.csv"

问题是\表示特殊字符。如果您使用&#34; r&#34;在字符串前面的字面值,这些特殊字符不会被转义:

>>> print r'--inform="file://D:\path\to\csv\template.csv"'
--inform="file://D:\path\to\csv\template.csv"