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 相关文章推荐
python对字典进行排序实例
Sep 25 Python
python中快速进行多个字符替换的方法小结
Dec 15 Python
Python实现登录接口的示例代码
Jul 21 Python
Python在信息学竞赛中的运用及Python的基本用法(详解)
Aug 15 Python
python检索特定内容的文本文件实例
Jun 05 Python
Python pymongo模块常用操作分析
Sep 01 Python
python 获得任意路径下的文件及其根目录的方法
Feb 16 Python
简单了解python 邮件模块的使用方法
Jul 24 Python
python同步windows和linux文件
Aug 29 Python
Django框架模板用法入门教程
Nov 04 Python
pytorch使用tensorboardX进行loss可视化实例
Feb 24 Python
Python一些基本的图像操作和处理总结
Jun 23 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读取文件内容到数组的方法
2015/03/16 PHP
PHP入门教程之上传文件实例详解
2016/09/11 PHP
js判断是否为ie的方法小结
2014/01/13 Javascript
javascript实现列表滚动的方法
2015/07/30 Javascript
微信小程序 视图容器组件的详解及实例代码
2017/01/19 Javascript
js实现动态显示时间效果
2017/03/06 Javascript
JavaScript实现经纬度转换成地址功能
2017/03/28 Javascript
jQuery实现可兼容IE6的遮罩功能详解
2017/09/19 jQuery
Angular整合zTree的示例代码
2018/01/24 Javascript
node打造微信个人号机器人的方法示例
2018/04/26 Javascript
webpack开发环境和生产环境的深入理解
2018/11/08 Javascript
vue页面加载时的进度条功能(实例代码)
2020/01/13 Javascript
微信小程序实现比较功能的方法汇总(五种方法)
2020/03/07 Javascript
JS使用for in有序获取对象数据
2020/05/19 Javascript
Vue3不支持Filters过滤器的问题
2020/09/24 Javascript
浅析python中的分片与截断序列
2016/08/09 Python
PyQt5实现下载进度条效果
2018/04/19 Python
django认证系统 Authentication使用详解
2019/07/22 Python
Python嵌套函数,作用域与偏函数用法实例分析
2019/12/26 Python
Python中os模块功能与用法详解
2020/02/26 Python
python 子类调用父类的构造函数实例
2020/03/12 Python
Python实现列表中非负数保留,负数转化为指定的数值方式
2020/06/04 Python
Jupyter notebook命令和编辑模式常用快捷键汇总
2020/11/17 Python
python Autopep8实现按PEP8风格自动排版Python代码
2021/03/02 Python
浅谈html5 响应式布局
2014/12/24 HTML / CSS
美国巧克力喷泉品牌:Sephra
2019/05/05 全球购物
navabi英国:设计师大码女装
2019/06/25 全球购物
大学生党员自我批评
2014/02/14 职场文书
手术室护士长竞聘书
2014/03/31 职场文书
财产公证书格式
2014/04/10 职场文书
希特勒经典演讲稿
2014/05/19 职场文书
工厂仓管员岗位职责范本
2014/07/17 职场文书
领导班子群众路线与四风问题对照检查材料思想汇报
2014/10/11 职场文书
2014年作风建设心得体会
2014/10/22 职场文书
计划生育汇报材料
2014/12/26 职场文书
《吸血鬼幸存者》新内容发布 追加多个全新模式
2022/04/07 其他游戏