我正在尝试从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
答案 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"