概述
使用python执行一些命令或调用第三方工具是比较常见的情况,实现的方法也很多,如os.system(),os.popen()、subprocess模块 中的函数等等
本文主要介绍一下os.popen()
语法
os.popen(cmd, mode='r', buffering=-1)
参数:
- Command : 调用的命令;
- mode :模式权限可以是 ‘r’(默认) 或 ‘w’;
- bufsize : 指明了文件需要的缓冲大小:0意味着无缓冲;1意味着行缓冲;其它正值表示使用参数大小的缓冲(大概值,以字节为单位);负的bufsize意味着使用系统的默认值。
返回:
- 返回文件对象
官方释义:
Open a pipe to or from command cmd. The return value is an open file object connected to the pipe, which can be read or written depending on whether mode is ‘r’ (default) or ‘w’.
从命令cmd打开一个管道,返回值是连接管道的文件对象,通过该对象可以进行读或写。
用法
1.返回文件对象
具有文件对象的特性
例子1:
p=os.popen("ping 192.168.1.1")
for line in p:
print(line,end="")
例子2:
with os.popen("ping 192.168.1.1") as p:
print(p.read())
2.非阻塞
os.popen()不会等cmd命令执行完,就继续下面的代码,例子:
p=os.popen("explorer")
print(1)
执行时,先打印1,然后打开文件夹
处理方法是使用read()或readlines()对命令的执行结果进行读操作。
3.阻塞
本质上os.popen()是非阻塞的,为了实现阻塞的效果,使用read()、eadlines()、close(),产生阻塞效果。
注意:如果执行无法退出或进入交互模式,这种read()、readlines()将形成完全阻塞的情况,表现的像程序卡住了。
例子1:
p=os.popen("ping 127.0.0.1 -t")
p.read()
print(1)
os.popen()执行了ping 127.0.0.1 -t,该命令会一直执行,因而,执行read()读取命令输出时会造成卡住。
使用os.popen()执行sqlplus命令对数据库进行操作的场景,如果sqlplus执行失败,会进入交互模式,如图所示,此时使用readlines()读取执行结果时也会卡死,效果如上图
总结
os.popen()在大多数场景都是挺好用方便的,但是也有坑!! 具体应用中,需要注意下。
建议:
在需要读取命令执行结果时,避免在命令无法退出或进入交互模式的场景应用。
如:执行ping baidu.com -t时会出问题os.popen()无法满足需求时,可以考虑subprocess.Popen();
感谢:https://blog.51cto.com/2681882/2317053
