我正在尝试使用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"])
有什么建议吗?
答案 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)
默认情况下,带subprocess.call
的{{1}}将禁用所有基于shell的功能,包括管道。使用shell=False
时,shell=True
可用于正确转义将用于构造shell命令的字符串中的空格和shell元字符。
您可以使用此代码
pipes.quote()