python:subprocess.check_output如何创建它的调用?

时间:2016-07-06 12:08:14

标签: python python-3.x mediainfo

我试图使用mediainfo读取视频文件的持续时间。这个shell命令工作

$(document).ready(function() {
    var GlobalNews = [];
    var CommentArray = [];
    var NewsArray = [];

    var CommentArr = {};
    CommentArr['Comment'] = 'aaa';
    CommentArray.push(CommentArr);   

    var NewsArr = {};
    NewsArr['NewsNo'] = 'bbb'
    NewsArr['Desc'] = 'vvv';
    NewsArray.push(NewsArr);

    GlobalNews = $.merge( CommentArray, NewsArray );
    console.log(GlobalNews)
});

并生成类似

的输出
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.10.1/jquery.min.js"></script>

但是当我尝试使用此行在python中运行它时

mediainfo --Inform="Video;%Duration/String3%" file

整个--Inform事件被忽略,我得到了完整的mediainfo输出。

有没有办法看到子流程构建的命令,看看有什么错?

或者任何人都可以告诉他们错了什么?

1 个答案:

答案 0 :(得分:2)

尝试:

subprocess.check_output(['mediainfo', '--Inform=Video;%Duration/String3%', file])

你的python字符串中的"可能会传递给mediainfo,它无法解析它们并会忽略该选项。

这类问题通常是由需要/吞下各种特殊字符的shell命令引起的。由于shell魔法,"通常会删除bash等引号。相比之下,python不需要它们用于魔法,因此会以你使用它们的方式复制它们。如果您不需要它们,为什么要使用它们? (好吧,呃,因为bash让你相信你需要它们。)

例如,在bash我可以做

$ dd of="foobar"

它将写入名为foobar的文件,吞下引号。

在python中,如果我这样做

subprocess.check_output(["dd", 'of="barfoo"', 'if=foobar'])

它将写入名为"barfoo"的文件,保留引号。