Python:需要使用bash one-liner

时间:2013-06-08 18:44:58

标签: python linux cpu

我正在尝试编写一个脚本来帮助我的公司进行一些调查。我无法在系统上安装任何额外的软件包,我需要能够以百分比的形式获得当前的处理器负载总量。

到目前为止,我找不到任何允许这样的本机python模块,因此我尝试使用bash命令: ps aux | awk'NR> 0 {s + = $ 3}; END {print“CPU%”,s}'

我一直在os.system和os.popen中尝试它,我似乎无法正确执行它。

import os, multiprocessing
p = os.system("ps aux|awk 'NR > 0 { s +=$3 }; END {print "cpu %",s}'")
print "Cores:", multiprocessing.cpu_count(), '\nCPU Load:', p

我可以使用一两个提示。我知道你应该在os.system中将命令和args与','分开,但我已经尝试了,但我似乎无法让它工作。有没有人知道在Python中执行长单行的更好方法?

我是python的新手,感谢任何给出的答案。谢谢。

2 个答案:

答案 0 :(得分:1)

尝试

import os, multiprocessing
p = os.popen("ps aux|awk 'NR > 0 { s +=$3 }; END {print s}'").read().rstrip("\n")
print "Cores:", multiprocessing.cpu_count(), '\nCPU Load:', p, "%"

给出

Cores: 4
CPU Load: 5.1 %

答案 1 :(得分:1)

你几乎就在那里:只需要“逃避”引号(即使用print \"代替print "等)以获得第一行:

import os, multiprocessing
p = os.system("ps aux|awk 'NR > 0 { s +=$3 }; END {print \"cpu %\",s}'")

你应该认识到os.system命令返回“返回代码” - 问题的答案“这个过程是否正常结束?”。因此p的值为0“无错误”,而不是变量s中的cpu加载。因为你已经将它打印出来,所以不确定为什么你需要它两次。将最后一行更改为

print "Cores:", multiprocessing.cpu_count(), '\n'

输出结果如下:

cpu% 65.7
Cores: 2 

如果您确实希望将系统命令的输出直接输入变量,可以查看给this earlier question的答案 - 它会告诉您如何使用subprocess.Popen()和{{1}这样做。但只是正确地获取命令行(使用转义引用)是最关键的修复。

更新以下两个完整且有效的Popen()和system()方法示例:

proc.communicate()

以上输出:

import os, multiprocessing, subprocess
# two ways to get CPU load and number of CPUs

# command line string to obtain CPU load:
commandString = "ps aux|awk 'NR > 0 { s+=$3 }; END {print \"CPU%\", s}'"
print "Command string used to obtain CPU load:"
print commandString, "\n"

# obtain number of CPUs from the multiprocessing function:
numCPUs = multiprocessing.cpu_count()

# method 1: issue an os.system command, have the result echoed directly to output:
print "Method 1:"
p = os.system(commandString)
print "Cores:", numCPUs, "\n"

# method 2: return the value to a python variable:
cpu = subprocess.Popen(commandString, stdout=subprocess.PIPE, shell=True)
(out, err) = cpu.communicate()
print "Method 2:"
print "Load: ", out,
print "Cores:", multiprocessing.cpu_count(), '\n'
相关问题