??斗地主捕鱼电竞提现秒到 广告位招租 - 15元/月全站展示
??支付宝搜索579087183领大额红包 ??伍彩集团官网直营彩票
??好待遇→招代理 ??伍彩集团官网直营彩票
??络茄网 广告位招租 - 15元/月全站展示
关于os.popen你可能不知道的

转载   平山   2018-11-14   浏览量:16


前言

使用python执行一些命令或调用第三方工具是比较常见的情况,实现的方法也很多,如os.system(),os.popen()、subprocess??橹械暮鹊?,本文主要介绍一下os.popen(),可能隐藏着你不曾接触的知识点,同时会结合实例进行说明,便于理解。

 

语法格式

首先我们看下os.popen的语法格式,如下:

os.popen(cmd, mode='r', buffering=-1)

 

参数说明:

Command --- 调用的命令;

mode --- 模式权限可以是 'r'(默认) 'w';

bufsize -- 指明了文件需要的缓冲大?。?/span>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.  返回值是文件对象

注意:返回值是文件对象,既然是文件对象,使用完就应该关闭,对吧?!不信网上搜一下,一大把文章提到这个os.popen都是忘记关闭文件对象的。 所以,推荐的写法是:

  with os.popen(command, "r") as p:
    r = p.read()


     至于with的用法就不多讲了,使用它,不需要显式的写p.close()。

 

2.  非阻塞

通俗的讲,非阻塞就是os.popen不会等cmd命令执行完毕就继续下面的代码了,不信?!看下面代码实例:

1.png

从上面实例可知,os.popen执行打开Uedit32.exe这个工具,但从实际执行结果看,Uedit32.exe还没打开,就直接进入了下一条语句,打印了“hello 小蟒社区”。在某些应用场景,可能这并不是你期望的行为,那如何让命令执行完后,再执行下一句呢?

处理方法是使用read()readlines()对命令的执行结果进行读操作。

 

3.  完全阻塞

上面写了该函数是非阻塞的,现在怎么又变成完全阻塞的呢?感觉一头雾水了吧。本质上os.popen是非阻塞的,为了实现阻塞的效果,我们使用read()readlines()对命令结果进行读,由此产生了阻塞的效果。但是,如果你的命令执行无法退出或进入交互模式,这种“读”将形成完全阻塞的情况,表现的像程序卡住了。

看下面代码实例1

2.png

os.popen执行了ping  127.0.0.1  -t 该命令会一直执行,除非CTRL+C强制退出,因而,执行readlines读取命令输出时会造成卡住。

 

代码实例2

使用os.popen执行sqlplus命令对数据库进行操作的场景,如果sqlplus执行失败,会进入交互模式,如图所示,此时使用readlines()读取执行结果时也会卡死,效果如上图:

3.png

 

总结

os.popen()在大多数场景都是挺好用方便的,但是也有坑??! 具体应用中,需要注意下。

建议:

1.       在需要读取命令执行结果时,避免在命令无法退出或进入交互模式的场景应用os.popen;

2.       os.popen()无法满足需求时,可以考虑subprocess.Popen();


其他资源

关于python学习、分享、交流,笔者开通了微信公众号【小蟒社区】,感兴趣的朋友可以关注下,欢迎加入,建立属于我们自己的小圈子,一起学python。


转载自://blog.51cto.com/2681882/2317053

招聘 不方便扫码就复制添加关注:程序员招聘谷,微信号:jobs1024



常用数据库操作语句(1)
建库CREATEDATABASEIFNOTEXISTSgloryroadDEFAULTCHARSETutf8COLLATEutf8_general_ci;建表createtablestudentInfo(IDintnotnullauto_incrementcomment"不为空的自增长的主键ID",student_idvarchar(20)notnull,namevarchar
处理任意格式的文本文件
#内存--硬盘内容序列话#手动挡#f=open('文件名或类似文件的东西','文件打卡模式')#f是文件对象或指针,用来进行读写操作#f.close()#三种模式:#w.write写#rread读#aappend追加内容importos%pwd'C:\\study\\jupyter'f=open('coop.txt','w')#用w的方式打开文件,不存在则创建f.write('coop'*7)#向
python3异步编程-实例
Python3异步编程实例篇本篇主要内容:启动一个线程启动多线程获取线程名字让线程按顺序执行给线程加上日志线程类的实现线程锁多线程使用全局变量下锁的重要性锁嵌套的问题使用队列来存储线程数据取得线程中的线果多线程与非多线程性能对比多线程与非多线程I/O操作线程池的使用一、用threading启动一个线程示例代码:#!/usr/bin/python3importtimefromthreadingimp
django自定义sql返回元组的处理
1.views.pydefscheduling(request):cursor=connection.cursor()cursor.execute("selectstaff_namefromalarm_platform.TBL_STAFFwherestaff_number=any(selectduty_staff_number1fromalarm_platform.TBL_DUTY);",None
Python基础--字典(dictionary)
1.字典的定义,键唯一,值随意dic={key0:value0,key1:value1}2.输出print(dic[key0])>>:value03.遍历字典3.1keys()遍历字典中的keydic={'name':'zhangsan','age':20}forkindic.keys():print(k)>>:nameage3.2values()遍历字典中的valuedi
Python基础--元组(tuple)
1.元组的定义,元组与列表不同之处在于元组中的元素不能修改:tup1=('张三','李四',123)2.读取元组数据,和列表相同print(tup1[0])>>:张三3.index()方法,返回元素在元组中得位置,不存在则报错print(tup1.index('张三'))>>:04.count()计算元素在元组中出现的次数print(tup1.count(123))>
Python面向对象程序设计之抽象工厂模式之二-一个更加pythonic的抽象工厂
????上一篇文章我们说到DiagramFactory和其SvgDiagramFactory子类以及它们使用到的类比如(Diagram,SvgDiagram等等),能够很好的实现预订的功能并且也符合抽象工厂的设计模式。然而,我们的实现并非是非常完美的,至少还有以下几点不足:我们并不需要保存每个工厂的状态,因此,在向create_diagram传递参数的
【Python基础】流程控制-break及continue使用及while..else的使用
'''break用于结束一个完整的循环,跳出循环体执行循环后面的语句continue用于跳出本次循环,但继续下一个循环''''''continue的用法打印1-10的数字,3除外'''#count=1#whilecount<=10:#ifcount==3:#count+=1##如果不添加count+=1当打印到3,直接跳出本次循环这个时候count还是3,就无法进行下次循环#continue
【Python基础】流程控制-while循环
#while循环'''while条件判断:满足条件执行的代码...条件判断的根本是True和False的判断True才会执行False不会执行通过一下方法来打印条件是True或者Falsea=10b=20print(a>b)print(b>a)'''#值条件判断:#a=3#b=5#正常条件判断#whilea>b:#print("啦啦啦")#死循环#whileTrue:#print
【Python基础】流程控制-if..else
'''基本的使用if条件:满足条件执行的代码else:不满足条件执行的代码'''#age=input("PleaseinputAge:")#age=int(age)#'''#从input得出的结果默认是str,str格式不能被<进行运算#所以必须进行转换类型#'''#ifage<30:#print("还能折腾几年")#else:#print("老了老了")'''多分支判断if条件:满足