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编写android截屏脚本双击运行即可
Jul 21 Python
Python实现抓取网页并且解析的实例
Sep 20 Python
Python 多线程实例详解
Mar 25 Python
python 2.7.13 安装配置方法图文教程
Sep 18 Python
pandas把所有大于0的数设置为1的方法
Jan 26 Python
python实现手机销售管理系统
Mar 19 Python
pywinauto自动化操作记事本
Aug 26 Python
python实现将视频按帧读取到自定义目录
Dec 10 Python
Python3 全自动更新已安装的模块实现
Jan 06 Python
python新手学习使用库
Jun 11 Python
基于python实现简单C/S模式代码实例
Sep 14 Python
python3爬虫中多线程进行解锁操作实例
Nov 25 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函数)
2006/10/09 PHP
PHP fgetcsv 定义和用法(附windows与linux下兼容问题)
2012/05/29 PHP
[原创]php正则删除img标签的方法示例
2017/05/27 PHP
php ajax数据传输和响应方法
2018/08/21 PHP
ajaxControlToolkit AutoCompleteExtender的用法
2008/10/30 Javascript
JS阻止冒泡事件以及默认事件发生的简单方法
2014/01/17 Javascript
获取IE浏览器Cookie信息的方法
2017/01/23 Javascript
JavaScript登录验证基础教程
2017/11/01 Javascript
微信小程序实现验证码获取倒计时效果
2018/02/08 Javascript
Vue2.0仿饿了么webapp单页面应用详细步骤
2018/07/08 Javascript
实例详解Vue项目使用eslint + prettier规范代码风格
2018/08/20 Javascript
Vue实现一个图片懒加载插件
2019/03/11 Javascript
基于Vue中使用节流Lodash throttle详解
2019/10/30 Javascript
JavaScript arguments.callee作用及替换方案详解
2020/09/02 Javascript
Pycharm学习教程(6) Pycharm作为Vim编辑器使用
2017/05/03 Python
Python爬虫之模拟知乎登录的方法教程
2017/05/25 Python
python绘制直线的方法
2018/06/30 Python
python实现定时压缩指定文件夹发送邮件
2020/12/22 Python
python 并发编程 阻塞IO模型原理解析
2019/08/20 Python
Django框架 查询Extra功能实现解析
2019/09/04 Python
python框架flask表单实现详解
2019/11/04 Python
新年福利来一波之Python轻松集齐五福(demo)
2020/01/20 Python
CSS3 translate导致字体模糊的实例代码
2019/08/30 HTML / CSS
小米乌克兰网上商店:Xiaomi.UA
2019/10/29 全球购物
请说出这段代码执行后a和b的值分别是多少
2015/03/28 面试题
森林防火工作方案
2014/02/14 职场文书
公交公司毕业生求职信
2014/02/15 职场文书
信息学院毕业生自荐信范文
2014/03/04 职场文书
财产公证书格式
2014/04/10 职场文书
2014年小学生教师节演讲稿范文
2014/09/10 职场文书
党的群众路线教育实践活动对照检查材料范文
2014/09/24 职场文书
市场部岗位职责
2015/02/12 职场文书
小学大队委竞选口号
2015/12/25 职场文书
实习报告怎么写
2019/06/20 职场文书
Python连续赋值需要注意的一些问题
2021/06/03 Python
解决linux下redis数据库overcommit_memory问题
2022/02/24 Redis