繁体   English   中英

Python:需要使用bash一线

[英]Python: need to use bash one-liner

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

到目前为止,我找不到任何允许该操作的本机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的新手,并感谢给出的所有答案。 谢谢。

尝试

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 %

您几乎就在那儿:只需要“转义”引号(即使用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 

如果你真的想要得到你的系统命令的输出直接到一个变量,你可以看看给予回答这个问题前面 -它表明你如何使用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 

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM