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去除所有html标签的方法
May 05 Python
python3实现TCP协议的简单服务器和客户端案例(分享)
Jun 14 Python
Python中进程和线程的区别详解
Oct 29 Python
批量将ppt转换为pdf的Python代码 只要27行!
Feb 26 Python
Python中的函数作用域
May 07 Python
基于python requests库中的代理实例讲解
May 07 Python
pytorch permute维度转换方法
Dec 14 Python
ubuntu 18.04 安装opencv3.4.5的教程(图解)
Nov 04 Python
selenium+python配置chrome浏览器的选项的实现
Mar 18 Python
python使用多线程+socket实现端口扫描
May 28 Python
Python 如何定义匿名或内联函数
Aug 01 Python
python如何操作mysql
Aug 17 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
[EPIC] Larva vs Flash ZvT @ Crossing Field [2017-10-09]
2020/03/17 星际争霸
php md5下16位和32位的实现代码
2008/04/09 PHP
php 获取mysql数据库信息代码
2009/03/12 PHP
frename PHP 灵活文件命名函数 frename
2009/09/09 PHP
关于Appserv无法打开localhost问题的解决方法
2009/10/16 PHP
下拉列表多级联动dropDownList示例代码
2013/06/27 PHP
浅析十款PHP开发框架的对比
2013/07/05 PHP
深入认识javascript中的eval函数
2009/11/02 Javascript
javascript基础知识大集锦(二) 推荐收藏
2011/01/13 Javascript
jQuery hover 延时器实现代码
2011/03/12 Javascript
JQuery实现鼠标移动到图片上显示边框效果
2014/01/09 Javascript
javascript生成随机大小写字母的方法
2014/02/20 Javascript
JS实现可拖曳、可关闭的弹窗效果
2015/09/26 Javascript
javascript实现的全国省市县无刷新多级关联菜单效果代码
2016/08/01 Javascript
Angular2学习笔记——详解NgModule模块
2016/12/02 Javascript
Canvas 制作动态进度加载水球详解及实例代码
2016/12/09 Javascript
JavaScript数组_动力节点Java学院整理
2017/06/26 Javascript
vuejs router history 配置到iis的方法
2018/09/20 Javascript
vue-quill-editor+plupload富文本编辑器实例详解
2018/10/19 Javascript
10个最受欢迎的 JavaScript框架(推荐)
2019/04/24 Javascript
node实现爬虫的几种简易方式
2019/08/22 Javascript
JavaScript页面加载事件实例讲解
2019/09/01 Javascript
详解javascript脚本何时会被执行
2021/02/05 Javascript
[00:12]2018DOTA2亚洲邀请赛SOLO赛 MidOne是否中单第一人?
2018/04/05 DOTA
Python获取指定文件夹下的文件名的方法
2018/02/06 Python
Pandas之drop_duplicates:去除重复项方法
2018/04/18 Python
Flask框架响应、调度方法和蓝图操作实例分析
2018/07/24 Python
Python读取Pickle文件信息并计算与当前时间间隔的方法分析
2019/01/30 Python
Python动态参数/命名空间/函数嵌套/global和nonlocal
2019/05/29 Python
浅谈python输出列表元素的所有排列形式
2020/02/26 Python
Kate Spade美国官网:纽约新兴时尚品牌,以包包闻名于世
2017/11/09 全球购物
线程的基本概念、线程的基本状态以及状态之间的关系
2012/10/26 面试题
土木工程毕业生自荐信
2013/09/21 职场文书
公司联欢晚会主持词
2014/03/22 职场文书
楚门的世界观后感
2015/06/03 职场文书
教师网络培训心得体会
2016/01/09 职场文书