如何在命令中使用python子进程调用

时间:2015-10-28 08:31:34

标签: python linux command subprocess call

我正在尝试使用pipe和head命令过滤掉Distinct().ToList().OrderBy(o => o.SharpNumber);的前3行。

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

/proc/meminfo

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

cat /proc/meminfo | head -3

虽然只是使用subprocess.call(["cat", "/proc/meminfo", "|", "head", "-3"]) 我正在获得整个列表,但我只对前3行感兴趣。

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

subprocess.call(["cat", "/proc/meminfo"])

有什么建议吗?

5 个答案:

答案 0 :(得分:2)

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

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

first_lines = lines[:3]

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

答案 1 :(得分:1)

要使用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

答案 2 :(得分:0)

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

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

来自manual

  

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

答案 3 :(得分:0)

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

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

答案 4 :(得分:0)

following this document

默认情况下,带subprocess.call的{​​{1}}将禁用所有基于shell的功能,包括管道。使用shell=False时,shell=True可用于正确转义将用于构造shell命令的字符串中的空格和shell元字符。

您可以使用此代码

pipes.quote()