如何使用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.call
和 shell=False
将禁用所有基于 shell 的功能,包括管道。使用 shell=True
时,pipes.quote()
可用于正确转义字符串中的空格和 shell 元字符,这些字符串将用于构造 shell 命令。
您可以使用此代码
subprocess.call("cat /proc/meminfo | head -3", shell=True)
【讨论】:
以上是关于如何使用python子进程调用在命令中使用管道[重复]的主要内容,如果未能解决你的问题,请参考以下文章