Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/285.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/27.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python:需要使用bash一行程序_Python_Linux_Cpu - Fatal编程技术网

Python:需要使用bash一行程序

Python:需要使用bash一行程序,python,linux,cpu,Python,Linux,Cpu,我正试图写一个脚本来帮助我的公司进行一些调查。我不能在系统上安装任何额外的软件包,我需要能够获得当前处理器总负载的百分比 到目前为止,我找不到任何本机python模块支持此功能,因此我尝试使用bash命令: ps aux|awk'NR>0{s+=3};结束{打印“CPU%”,s}' 我一直在os.system和os.popen中尝试,但似乎无法正确执行 import os, multiprocessing p = os.system("ps aux|awk 'NR > 0 { s +=$3

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

到目前为止,我找不到任何本机python模块支持此功能,因此我尝试使用bash命令: ps aux|awk'NR>0{s+=3};结束{打印“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新手,非常感谢您的回答。谢谢。

试试看

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, "%"
给予


你就快到了:只需要“转义”引号(即使用
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()
来实现这一点。但最关键的修复方法是正确使用命令行(使用转义引号)

update下面是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 

谢谢你的回答。不过还是不行。我看了那篇文章,修改了我的脚本:
import subprocess,multiprocessing cpu=subprocess.Popen([“ps aux | awk'NR>0{s+=3;END{print\“cpu%\”,s')),stdout=subprocess.PIPE,shell=True)(out,err)=cpu.communicate()print“核心:”multiprocessing.cpu.count(),“\n”print“Load”,out
我仍然收到错误。它在第二个's'处返回“意外换行符或字符串结尾”。感谢转义的引号。没有考虑到这一点。:)您的命令中有几个输入错误:您正在打开
{
而没有关闭它们…我已更新了我的答案“为了完整性”-注意,通过将命令字符串放在它自己的变量中,您可以更清楚地看到两个调用之间的差异。确实如此。谢谢。不过,这两个都是很好的答案。
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