1

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

到目前为止,我找不到任何允许这样做的本机 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 中用“,”分隔命令和参数,但我已经尝试过,但似乎无法让它工作。有谁知道在 Python 中执行长单行的更好方法?

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

4

2 回答 2

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 %
于 2013-06-08T18:51:21.370 回答
1

你几乎就在那里:只需要“转义”引号(即使用print \"而不是print "等)来获得第一行的权利:

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

您应该认识到该os.system命令返回“返回码”——“此过程是否正常结束?”问题的答案。因此, 的值p0“无错误”,而不是变量中的 cpu 负载s。不知道为什么你需要它两次,因为你已经打印出来了。将最后一行更改为

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

输出变成这样:

cpu% 65.7
Cores: 2 

如果您真的想将系统命令的输出直接放入变量中,您可以查看对这个较早问题的答案- 它向您展示了如何使用subprocess.Popen()proc.communicate()做到这一点。但只是让命令行正确(带有转义的引号)是最关键的修复。

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

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'

上述输出:

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

Method 1:
CPU% 18.5
Cores: 2 

Method 2:
Load:  CPU% 24.1
Cores: 2 
于 2013-06-08T18:53:14.857 回答