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 BeautifulSoup中文乱码问题的2种解决方法
Apr 22 Python
Python ValueError: invalid literal for int() with base 10 实用解决方法
Jun 21 Python
Python中使用asyncio 封装文件读写
Sep 11 Python
读写json中文ASCII乱码问题的解决方法
Nov 05 Python
Python中列表与元组的乘法操作示例
Feb 10 Python
Django中的ajax请求
Oct 19 Python
python 切换root 执行命令的方法
Jan 19 Python
pandas数据集的端到端处理
Feb 18 Python
Python 自动登录淘宝并保存登录信息的方法
Sep 04 Python
利用 PyCharm 实现本地代码和远端的实时同步功能
Mar 23 Python
Numpy 理解ndarray对象的示例代码
Apr 03 Python
matplotlib.pyplot.plot()参数使用详解
Jul 28 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去掉字符串的最后一个字符附substr()的用法
2011/03/23 PHP
php分页代码学习示例分享
2014/02/20 PHP
php中使用getimagesize获取图片、flash等文件的尺寸信息实例
2014/04/29 PHP
smarty内置函数section的用法
2015/01/22 PHP
php版微信公众号接口实现发红包的方法
2016/10/14 PHP
PHP与以太坊交互详解
2018/08/24 PHP
PHP开发api接口安全验证操作实例详解
2020/03/26 PHP
6个常见的 PHP 安全性攻击实例和阻止方法
2020/12/16 PHP
jQuery事件 delegate()使用方法介绍
2012/10/30 Javascript
JS限制文本框只能输入数字和字母方法
2015/02/28 Javascript
chrome不支持form.submit的解决方案
2015/04/28 Javascript
js实现继承的5种方式
2015/12/01 Javascript
使用 jQuery.ajax 上传带文件的表单遇到的问题
2016/10/31 Javascript
基于AGS JS开发自定义贴图图层
2017/03/31 Javascript
浅谈react 同构之样式直出
2017/11/07 Javascript
Node 升级到最新稳定版的方法分享
2018/05/17 Javascript
在Vue中创建可重用的 Transition的方法
2020/06/02 Javascript
python创建和使用字典实例详解
2013/11/01 Python
使用Python实现一个简单的项目监控
2015/03/31 Python
python程序封装为win32服务的方法
2021/03/07 Python
python中dir()与__dict__属性的区别浅析
2018/12/10 Python
python+selenium 点击单选框-radio的实现方法
2019/09/03 Python
Python 如何展开嵌套的序列
2020/08/01 Python
用python绘制樱花树
2020/10/09 Python
俄罗斯的精英皮具:Wittchen
2018/01/29 全球购物
Hotter Shoes美国官网:英国最受欢迎的舒适鞋
2018/08/02 全球购物
MAC彩妆澳洲官网:M·A·C AU
2021/01/17 全球购物
简述索引存取方法的作用和建立索引的原则
2013/03/26 面试题
解决方案设计综合面试题
2015/08/31 面试题
采购部部长岗位职责
2014/02/06 职场文书
保密工作承诺书
2014/08/29 职场文书
未受刑事制裁公证证明
2014/09/20 职场文书
Nginx+Tomcat实现负载均衡、动静分离的原理解析
2021/03/31 Servers
口袋妖怪冰系十大最强精灵,几何雪花排第七,第六类似北极熊
2022/03/18 日漫
redis数据结构之压缩列表
2022/03/21 Redis
云服务器部署 Web 项目的实现步骤
2022/06/28 Servers