利用python执行linux命令的几种方式和区别

        本文介绍三种在python执行linux命令的方式,三种方式都是基于python的标准库实现,因此不需要额外安装第三方库。

os.system()

        os.system(cmd),其中cmd就是需要执行的linux命令。该方式会阻塞主进程,直到命令执行结束并返回状态,如果返回的状态值为0,表示命令正常执行,如果不为0,则表示命令执行异常。要注意的是,该方式执行linux命令,会直接打印出命令执行的结果,但是不会作为对象返回,因此程序无法直接获取命令执行的结果。

os.popen()

        os.popen(cmd)方式,不会阻塞主进程,执行命令的子进程会和主进程同步运行,如果想要进行阻塞,等到命令执行完再执行下一步,可以通过os.wait()函数等到子进程执行完毕。

        os.popen()会返回一个对象,该对象可文件对象类似,支持文件对象的读写接口,该对象会保存命令执行的结果,可以通过对象的read()函数获取结果内容。因此,该方式相比于os.system()的特点是,不阻塞子进程,可以直接获取命令执行的结构。

subprocess.Popen()

        subprocess.Popen(args,shell=True,stdout=f),其中args可以为字符串,也可以为一个列表,如果是字符串,那么会将其认为是可执行程序直接运行,如果是一个列表,则会将其当做是空格隔开的shell命令,此时需要将shell参数设为True,才行。例如subprocess.Popen(['ps','-ef'],shell=True),会显示所有的进程。这里需要注意的是,这里默认环境是当前主进程,因此只会显示当前主进程下所有的进程信息,而不是整个系统的进程信息。subprocess.Popen()返回的对象具有多个方法,默认该方式对于命令执行是非阻塞的,但是可以通过p.wait()进行阻塞,其中p表示返回的对象,还可以通过pid属性获取进程号,kill()方法直接结束进程等。

        此外,对于命令的执行结果,默认是直接打印出来,还可以通过stdout参数重定向到文件中,比如设置stdout参数为一个文件对象,就可以将结果输出到文件中。如果该文件同时支持读取模式,那么还可以先将文件指针seek到指定位置再读取命令执行后的输出结果。(因为写入输出结果后,文件指针在文件最后,因此直接读取是无法读到内容的,所以需要先seek到指定位置,比如0位置,才能读取)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值