最近迷上了os.popen().read(),于是对python的几种调用系统命令的方法进一步了解了一下
os.system()
与C,perl一样,python的system()直观,执行下系统命令,跟直接敲系统命令没有两样
eg:os.system(‘ls’)
上面这行就把ls执行了一遍,跟bash上直接敲ls一致,屏幕上打印ls的结果(但是这么写确认你不是闲得蛋疼?)
p = subprocess.Popen(”, shell = True)
p.wait()
subprocess.Popen(”, stdout = subprocess.PIPE).stdout
前面那个我觉得没啥实际大的意义,后面这个与上面最大的差别是此处返回的是执行这个命令的结果的一个读的文件对象,也就是说,如果你不在乎这条系统命令的操作,而是想处理这条命令输出的结果,想要二次分析处理,就会十分直观方便,一个简单的例子,想根据lscpu判断当前运行环境是否为64位
arch_pattern = ‘^Architecture:\s+(\w.*)’
os_fd = subprocess.Popen(‘lscpu’, stdout = subprocess.PIPE).stdout
for eachLine in os_fd:
match = re.match(arch_Pattern, eachLine)
if match is not None:
arch = match.group(1)
if arch == ‘x86_64’:
print ‘Linux OS: 64bit’
else:
print ‘Linux OS: 32bit’
但是很多说法表示Popen有一个缺陷,它是一个阻塞的方法,也就是假如调用的系统命令的输出内容非常多,函数非常容易阻塞住,据说还可能无法获取返回值了,目前我试过的内容相对比较少,因此没碰到过这种情况,可能意思是使用了管道,而不去处理管道的输出,输出数据太多了,造成死锁,关键只要通过边读边逐行处理,相信这种情况应该不会发生
os.popen(”).read()
这个是最近用的比较多,主要是替换上一种process方法,比较无脑,输出的也是读的文件对象,上面列子第二行换成os.popen(‘lscpu’).read()即可,主要是感觉写起来简洁,偷下懒,意思都是一样的,返回的是命令的输出结果