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 匹配任意字符(包括换行符)的正则表达式写法
Oct 29 Python
使用Python中PDB模块中的命令来调试Python代码的教程
Mar 30 Python
Python的Django框架中settings文件的部署建议
May 30 Python
Android分包MultiDex策略详解
Oct 30 Python
python学生信息管理系统
Mar 13 Python
python 同时读取多个文件的例子
Jul 16 Python
python实现智能语音天气预报
Dec 02 Python
Linux下升级安装python3.8并配置pip及yum的教程
Jan 02 Python
在TensorFlow中屏蔽warning的方式
Feb 04 Python
Django的ListView超详细用法(含分页paginate)
May 21 Python
keras 自定义loss损失函数,sample在loss上的加权和metric详解
May 23 Python
Python 中的 copy()和deepcopy()
Nov 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-5.2 的 php.ini 中文版[金步国翻译]
2011/04/17 PHP
PHP数字和字符串ID互转函数(类似优酷ID)
2014/06/30 PHP
php读取远程gzip压缩网页的方法
2014/12/29 PHP
PHP自毁程序(慎用)
2015/07/09 PHP
PHP与Java对比学习日期时间函数
2016/07/03 PHP
Yii2.0框架模型多表关联查询示例
2019/07/18 PHP
基于JQuery实现CheckBox全选全不选
2011/06/27 Javascript
js加强的经典分页实例
2013/03/15 Javascript
利用javascript数组长度循环数组内所有元素
2013/12/27 Javascript
javascript的document.referrer浏览器支持、失效情况总结
2014/07/18 Javascript
深入理解js数组的sort排序
2016/05/28 Javascript
深入理解JS DOM事件机制
2016/08/06 Javascript
基于JQuery实现的跑马灯效果(文字无缝向上翻动)
2016/12/02 Javascript
详解Vue 事件驱动和依赖追踪
2017/04/22 Javascript
解决vue中使用swiper插件问题及swiper在vue中的用法
2018/04/04 Javascript
微信小程序实现一张或多张图片上传(云开发)
2019/09/25 Javascript
js 使用ajax设置和获取自定义header信息的方法小结
2020/03/12 Javascript
解决vue中axios设置超时(超过5分钟)没反应的问题
2020/09/04 Javascript
[00:34]TI7不朽珍藏III——纯金地穴编织者饰品展示
2017/07/15 DOTA
python之import机制详解
2014/07/03 Python
Python 字符串操作(string替换、删除、截取、复制、连接、比较、查找、包含、大小写转换、分割等)
2018/03/19 Python
Python发送邮件测试报告操作实例详解
2018/12/08 Python
Python学习笔记之Django创建第一个数据库模型的方法
2019/08/07 Python
pycharm快捷键汇总
2020/02/14 Python
python 6行代码制作月历生成器
2020/09/18 Python
Pycharm 跳转回之前所在页面的操作
2021/02/05 Python
如何用Python编写一个电子考勤系统
2021/02/08 Python
美国班级戒指、帽子和礼服、毕业产品、年鉴:Balfour
2018/11/01 全球购物
美国领先的眼镜和太阳镜在线零售商:Glasses.com
2019/08/26 全球购物
在浏览器端如何得到服务器端响应的XML数据
2012/11/24 面试题
电工技术比武方案
2014/05/11 职场文书
文明礼仪标语
2014/06/13 职场文书
县政府办公室领导班子个人对照检查材料
2014/09/16 职场文书
2015年学校精神文明工作总结
2015/05/27 职场文书
Django实现聊天机器人
2021/05/31 Python
基于Python实现将列表数据生成折线图
2022/03/23 Python