今天试着把两个shell小脚本转化成Python版本
一. 脚本1 判断所接的nvme 在哪个CPU上
#!/bin/bash
lscpu |grep -i node
for nvme in `nvme list|sed 1,2d|awk '{print $1}'|awk -F "/" '{print $NF}'`
do
echo $nvme
busid=$(readlink -f /sys/block/$nvme |cut -d '/' -f 6)
echo "busid = $busid"
lspci -s $busid -vv |grep -i node
echo "======================================"
done
运行结果如下:
下面用Python的OS模块转化一下,代码如下:
import os
cpu=os.popen("lscpu|grep -i node").read()
print (cpu.strip())
nvme=os.popen("nvme list|grep -i nvme|awk {'print $1'}|awk -F '/' {'print $NF'}").read()
for ssd in nvme.split():
print (ssd)
busid=os.popen("readlink -f /sys/block/" + ssd + " |cut -d '/' -f 6").read()
print ('busid = ',busid.strip())
busip=busid.strip()
numa=os.popen("lspci -s "+busip+" -vv |grep -i node").read()
print (numa.strip())
print('=====================')
运行结果如下:
二. 判断OS的小脚本:
#!/bin/bash
bootdisk=`df -h | awk '{print $1}' | grep -iE "/dev/sd" | sed 's/[0-9]//g' |sort -u|awk -F "/" '{print $NF}'`
if test -z "$bootdisk"
then
bootdisk=`df -h | awk '{print $1}' | grep -iE "/dev/nvme" | sed 's/p[0-9]//g' |sort -u|awk -F "/" '{print $NF}'`
echo "os disk is $bootdisk"
else
echo "os disk is $bootdisk"
fi
运行结果如下:
转化成Python,代码如下:
import os
bootdisk=os.popen("df -h | awk '{print $1}' | grep -iE '/dev/sd' | sed 's/[0-9]//g' |sort -u|awk -F '/' '{print $NF}' ").read()
#print bootdisk.strip()
if len(bootdisk) == 0:
bootdisk=os.popen("df -h | awk '{print $1}' | grep -iE '/dev/nvme' | sed 's/p[0-9]//g' |sort -u|awk -F '/' '{print $NF}'").read()
print ('os disk is ', bootdisk.strip())
else:
print ('os disk is ', bootdisk.strip())
运行结果如下:
总结:其实就是借用OS模块的popen函数来调用Linux指令,不过仍有几点需要注意
1 Python2和Python有很多格式不同
2 调用指令加变量的时候 需要拼接,不能直接调用
3 调用命令的时候是不识别" "的,需要转化为’ ',比如 awk -F “/” ‘{print $NF}’ 写成awk -F ‘/’ ‘{print $NF}’
4 用popen读取指令的时候,可能会带些空格或者换行,需要去掉这些,Python中有很多方法,比如split(),strip()等等
5 有些很长的命令,还是用shell写脚本方便,处理一些数据(表格,画图)时,用Python更简单一点。可以用Python调用shell,也可以用shell调用Python。不过在服务器测试或者SSD产品测试这个圈子,大部分是两者混用的