Python subprocess模块常见用法分析


Posted in Python onJune 12, 2018

本文实例讲述了Python subprocess模块常见用法。分享给大家供大家参考,具体如下:

subprocess模块是python从2.4版本开始引入的模块。主要用来取代 一些旧的模块方法,如os.system、os.spawn*、os.popen*、commands.*等。subprocess通过子进程来执行外部指令,并通过input/output/error管道,获取子进程的执行的返回信息。

常用方法:

subprocess.call():执行命令,并返回执行状态,其中shell参数为False时,命令需要通过列表的方式传入,当shell为True时,可直接传入命令

示例如下:

>>> a = subprocess.call(['df','-hT'],shell=False)
Filesystem Type Size Used Avail Use% Mounted on
/dev/sda2  ext4  94G 64G 26G 72% /
tmpfs  tmpfs 2.8G  0 2.8G 0% /dev/shm
/dev/sda1  ext4 976M 56M 853M 7% /boot
>>> a = subprocess.call('df -hT',shell=True)
Filesystem Type Size Used Avail Use% Mounted on
/dev/sda2  ext4  94G 64G 26G 72% /
tmpfs  tmpfs 2.8G  0 2.8G 0% /dev/shm
/dev/sda1  ext4 976M 56M 853M 7% /boot
>>> print a
0

subprocess.check_call():用法与subprocess.call()类似,区别是,当返回值不为0时,直接抛出异常

示例:

>>> a = subprocess.check_call('df -hT',shell=True)
Filesystem Type Size Used Avail Use% Mounted on
/dev/sda2  ext4  94G 64G 26G 72% /
tmpfs  tmpfs 2.8G  0 2.8G 0% /dev/shm
/dev/sda1  ext4 976M 56M 853M 7% /boot
>>> print a
0
>>> a = subprocess.check_call('dfdsf',shell=True)
/bin/sh: dfdsf: command not found
Traceback (most recent call last):
 File "<stdin>", line 1, in <module>
 File "/usr/lib64/python2.6/subprocess.py", line 502, in check_call
 raise CalledProcessError(retcode, cmd)
subprocess.CalledProcessError: Command 'dfdsf' returned non-zero exit status 127

subprocess.check_output():用法与上面两个方法类似,区别是,如果当返回值为0时,直接返回输出结果,如果返回值不为0,直接抛出异常。需要说明的是,该方法在python3.x中才有。

subprocess.Popen()

在一些复杂场景中,我们需要将一个进程的执行输出作为另一个进程的输入。在另一些场景中,我们需要先进入到某个输入环境,然后再执行一系列的指令等。这个时候我们就需要使用到suprocess的Popen()方法。该方法有以下参数:

args:shell命令,可以是字符串,或者序列类型,如list,tuple。
bufsize:缓冲区大小,可不用关心
stdin,stdout,stderr:分别表示程序的标准输入,标准输出及标准错误
shell:与上面方法中用法相同
cwd:用于设置子进程的当前目录
env:用于指定子进程的环境变量。如果env=None,则默认从父进程继承环境变量
universal_newlines:不同系统的的换行符不同,当该参数设定为true时,则表示使用\n作为换行符

示例1,在/root下创建一个suprocesstest的目录:

>>> a = subprocess.Popen('mkdir subprocesstest',shell=True,cwd='/root')

示例2,使用python执行几个命令:

import subprocess
obj = subprocess.Popen(["python"], stdin=subprocess.PIPE, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
obj.stdin.write('print 1 \n')
obj.stdin.write('print 2 \n')
obj.stdin.write('print 3 \n')
obj.stdin.write('print 4 \n')
obj.stdin.close()
cmd_out = obj.stdout.read()
obj.stdout.close()
cmd_error = obj.stderr.read()
obj.stderr.close()
print cmd_out
print cmd_error

也可以使用如下方法:

import subprocess
obj = subprocess.Popen(["python"], stdin=subprocess.PIPE, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
obj.stdin.write('print 1 \n')
obj.stdin.write('print 2 \n')
obj.stdin.write('print 3 \n')
obj.stdin.write('print 4 \n')
out_error_list = obj.communicate()
print out_error_list

示例3,将一个子进程的输出,作为另一个子进程的输入:

import subprocess
child1 = subprocess.Popen(["cat","/etc/passwd"], stdout=subprocess.PIPE)
child2 = subprocess.Popen(["grep","0:0"],stdin=child1.stdout, stdout=subprocess.PIPE)
out = child2.communicate()

其他方法:

import subprocess
child = subprocess.Popen('sleep 60',shell=True,stdout=subprocess.PIPE)
child.poll() #检查子进程状态
child.kill()  #终止子进程
child.send_signal() #向子进程发送信号
child.terminate() #终止子进程

希望本文所述对大家Python程序设计有所帮助。

Python 相关文章推荐
Django返回json数据用法示例
Sep 18 Python
python 根据pid杀死相应进程的方法
Jan 16 Python
Python实现的排列组合计算操作示例
Oct 13 Python
Python进阶之尾递归的用法实例
Jan 31 Python
python入门教程 python入门神图一张
Mar 05 Python
Pandas 同元素多列去重的实例
Jul 03 Python
python消费kafka数据批量插入到es的方法
Dec 27 Python
Python中extend和append的区别讲解
Jan 24 Python
python程序变成软件的实操方法
Jun 24 Python
使用Python对Dicom文件进行读取与写入的实现
Apr 20 Python
python中Tkinter 窗口之输入框和文本框的实现
Apr 12 Python
Python实现的扫码工具居然这么好用!
Jun 07 Python
python 基本数据类型占用内存空间大小的实例
Jun 12 #Python
Python中.join()和os.path.join()两个函数的用法详解
Jun 11 #Python
使用Python进行QQ批量登录的实例代码
Jun 11 #Python
python中使用psutil查看内存占用的情况
Jun 11 #Python
Python运维之获取系统CPU信息的实现方法
Jun 11 #Python
python 实时得到cpu和内存的使用情况方法
Jun 11 #Python
Python3正则匹配re.split,re.finditer及re.findall函数用法详解
Jun 11 #Python
You might like
PHP的password_hash()使用实例
2014/03/17 PHP
编写PHP脚本使WordPress的主题支持Widget侧边栏
2015/12/14 PHP
PHP使用zlib扩展实现GZIP压缩输出的方法详解
2018/04/09 PHP
javascript检测浏览器flash版本的实现代码
2011/12/06 Javascript
jquery.pagination.js 无刷新分页实现步骤分享
2012/05/23 Javascript
各种常用的JS函数整理
2013/10/25 Javascript
jquery实现点击向下展开菜单项(伸缩导航)效果
2015/08/22 Javascript
基于javascript html5实现多文件上传
2016/03/03 Javascript
1秒50万字!js实现关键词匹配
2016/08/01 Javascript
Express本地测试HTTPS的示例代码
2018/06/06 Javascript
vue中使用gojs/jointjs的示例代码
2018/08/24 Javascript
微信小程序上线发布流程图文详解
2019/05/06 Javascript
layui实现鼠标移动到单元格上显示数据的方法
2019/09/11 Javascript
微信小程序实现多选框功能的实例代码
2020/06/24 Javascript
Vue 数据响应式相关总结
2021/01/28 Vue.js
go和python调用其它程序并得到程序输出
2014/02/10 Python
python使用opencv按一定间隔截取视频帧
2018/03/06 Python
python spyder中读取txt为图片的方法
2018/04/27 Python
python基于Selenium的web自动化框架
2019/07/14 Python
python关于矩阵重复赋值覆盖问题的解决方法
2019/07/19 Python
PyQT5 emit 和 connect的用法详解
2019/12/13 Python
pytorch动态网络以及权重共享实例
2020/01/06 Python
Python面向对象程序设计之继承、多态原理与用法详解
2020/03/23 Python
Python限制内存和CPU使用量的方法(Unix系统适用)
2020/08/04 Python
Python读取xlsx数据生成图标代码实例
2020/08/12 Python
torchxrayvision包安装过程(附pytorch1.6cpu版安装)
2020/08/26 Python
解决python便携版无法直接运行py文件的问题
2020/09/01 Python
使用HTML5和CSS3表单验证功能
2017/05/05 HTML / CSS
美国Rue La La闪购网站:奢侈品、中高档品牌限时折扣
2016/10/19 全球购物
Keds官方网站:购买帆布运动鞋和经典皮鞋
2016/11/12 全球购物
乌克兰时尚鞋子和衣服购物网站:Born2be
2018/05/24 全球购物
瑞士设计师家具和家居饰品网上商店:Bruno Wickart
2019/03/18 全球购物
法语专业求职信
2014/07/20 职场文书
2015社区六五普法工作总结
2015/04/21 职场文书
学习焦裕禄观后感
2015/06/09 职场文书
win10电脑老是死机怎么办?win10系统老是死机的解决方法
2022/08/05 数码科技