如何使用python子进程调用在命令中使用管道[重复]

Posted

技术标签:

【中文标题】如何使用python子进程调用在命令中使用管道[重复]【英文标题】:How to use pipe in command using python sub process call [duplicate] 【发布时间】:2016-01-27 22:31:25 【问题描述】:

我正在尝试使用 pipe 和 head 命令过滤掉 /proc/meminfo 的前 3 行。

所以基本上我需要在 Python 中运行它:

cat /proc/meminfo | head -3

我在我的代码中使用以下行:

subprocess.call(["cat", "/proc/meminfo", "|", "head", "-3"])

虽然只使用 subprocess.call(["cat", "/proc/meminfo"]) 我得到了整个列表,但我只对前 3 行感兴趣。

使用上面的命令给我以下错误:

cat: invalid option -- '3'
Try `cat --help' for more information.

有什么建议吗?

【问题讨论】:

管道由shell提供,因此您失败了。你可以试试 subprocess.call(["/bin/bash", "-c", "/bin/cat /proc/meminfo | /usr/bin/head -3"]) 没有必要为了读取文件而创建子进程。请参阅下面的解决方案。 【参考方案1】:

/proc/meminfo 只是一个文件。您不需要子进程来读取它。只需将其作为文件打开并读取。这就是你所需要的:

fh = open('/proc/meminfo', 'r')
lines = fh.readlines()
fh.close()

first_lines = lines[:3]

first_lines 列表将包含前三行(包括尾随换行符)。

【讨论】:

那么……又是一个 XY 问题? 甚至 list(itertools.islice(open('/proc/meminfo'), 3)) -- 在这种情况下并不重要,但一般来说,如果文件很大,那么 islice() 比读取 all 的 .readlines() 效率更高 行。【参考方案2】:

要使用 pip,您必须将 shell 启用为 shell=True,但出于安全原因,不建议这样做。你可以这样做,

import subprocess
ps = subprocess.Popen(('cat', '/proc/meminfo'),stdout=subprocess.PIPE)
output = subprocess.check_output(('head', '-3'), stdin=ps.stdout)
print output

【讨论】:

只要传递静态命令,即不基于输入值,使用shell=True选项是安全的。 是的,你是对的。我概括了答案,因此可以对其他人有所帮助 感谢您的回复..【参考方案3】:

管道是一个shell语法元素。您需要在 shell 中运行代码 才能使用管道:

subprocess.call(["cat /proc/meminfo | head -3"], shell=True)

来自manual:

如果 shell 为 True,指定的命令将通过 shell 执行。如果您将 Python 主要用于它在大多数系统 shell 上提供的增强控制流,并且仍然希望方便地访问其他 shell 功能,例如 shell 管道、文件名通配符、环境变量扩展和 ~ 到用户家的扩展,这将很有用目录。

【讨论】:

谢谢..工作完美【参考方案4】:

head 实际上接受一个参数,所以管道实际上不是必需的。以下应该给出预期的结果。

subprocess.call(["head", "-3", "/proc/meminfo"])

【讨论】:

感谢 Vijay...这就是我一直在寻找的东西,无需使用太多代码,而是使用一个衬垫来解决我的目的...完美运行【参考方案5】:

following this document

默认情况下,subprocess.callshell=False 将禁用所有基于 shell 的功能,包括管道。使用 shell=True 时,pipes.quote() 可用于正确转义字符串中的空格和 shell 元字符,这些字符串将用于构造 shell 命令。

您可以使用此代码

subprocess.call("cat /proc/meminfo | head -3", shell=True)

【讨论】:

以上是关于如何使用python子进程调用在命令中使用管道[重复]的主要内容,如果未能解决你的问题,请参考以下文章

带有管道的子进程调用[重复]

Python 子进程中的 ffmpeg - 无法为“管道:”找到合适的输出格式

如何在 Python 中使用子进程重定向输出?

使用子进程的python脚本,将所有输出重定向到文件

linux进程管道和重定向

使用带有 python3 的子进程模块管道两个命令时遇到问题