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

Posted

技术标签:

【中文标题】python: subprocess.check_output 如何创建它的调用?【英文标题】:python: How does subprocess.check_output create it's calls? 【发布时间】:2016-11-08 11:34:55 【问题描述】:

我正在尝试使用 mediainfo 读取视频文件的持续时间。这个shell命令有效

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

并产生类似的输出

00:00:33.600

但是当我尝试用这一行在 python 中运行它时

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

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

有没有办法查看子进程构造的命令看看有什么问题?

或者谁能告诉我哪里出了问题?

【问题讨论】:

您是否尝试过将所有内容放在一个参数中? subprocess.check_output(['mediainfo --Inform="Video;%Duration/String3%"', file]) 我做了,但这不起作用,因为子进程可以(正确)找不到程序“mediainfo --Inform=...”。 我觉得你不需要双引号,试试Inform=Video;%Duration/String3% 谢谢,成功了。 这两个破折号仍然是必要的。 【参考方案1】:

试试:

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" 的文件,保留引号。

【讨论】:

以上是关于python: subprocess.check_output 如何创建它的调用?的主要内容,如果未能解决你的问题,请参考以下文章

当父进程死亡时,如何杀死使用 subprocess.check_output() 创建的 python 子进程?

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

Python子进程subprocess.check_output和journalctl游标

如何从 Python subprocess.check_output() 捕获异常输出?

了解python subprocess.check_output的第一个参数和shell = True [重复]

python3 subprocess.check_output的使用