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的循环体中使用else语句的方法
Mar 30 Python
详细讲解用Python发送SMTP邮件的教程
Apr 29 Python
基础的十进制按位运算总结与在Python中的计算示例
Jun 28 Python
Python自定义进程池实例分析【生产者、消费者模型问题】
Sep 19 Python
PyQt5每天必学之关闭窗口
Apr 19 Python
对pandas中iloc,loc取数据差别及按条件取值的方法详解
Nov 06 Python
python3中pip3安装出错,找不到SSL的解决方式
Dec 12 Python
python numpy 矩阵堆叠实例
Jan 17 Python
详解pandas获取Dataframe元素值的几种方法
Jun 14 Python
基于Python的自媒体小助手---登录页面的实现代码
Jun 29 Python
Python的三个重要函数详解
Jan 18 Python
python Tkinter模块使用方法详解
Apr 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 设计模式之 工厂模式
2008/12/19 PHP
Mysql的Root密码忘记,查看或修改的解决方法(图文介绍)
2013/06/14 PHP
php实例分享之通过递归实现删除目录下的所有文件详解
2014/05/15 PHP
PHP登录环节防止sql注入的方法浅析
2014/06/30 PHP
解读PHP中的垃圾回收机制
2015/08/10 PHP
php防止sql注入的方法详解
2017/02/20 PHP
PHP清除缓存的几种方法总结
2017/09/12 PHP
PHP基于面向对象实现的留言本功能实例
2018/04/04 PHP
js确定对象类型方法
2012/03/30 Javascript
javascript处理a标签超链接默认事件的方法
2015/06/29 Javascript
JQuery菜单效果的两个实例讲解(3)
2015/09/17 Javascript
jQuery实现分章节锚点“回到顶部”动画特效代码
2015/10/23 Javascript
javascript实现的登陆遮罩效果汇总
2015/11/09 Javascript
BootStrap无限级分类(无限极分类封装版)
2016/08/26 Javascript
什么是JavaScript注入攻击?
2016/09/14 Javascript
深入理解Javascript中的作用域链和闭包
2017/04/25 Javascript
Angular浏览器插件Batarang介绍及使用
2018/02/07 Javascript
[01:45]2014DOTA2 TI预选赛预选赛 战前探营!
2014/05/21 DOTA
Python功能键的读取方法
2015/05/28 Python
Django进阶之CSRF的解决
2018/08/01 Python
使用python绘制温度变化雷达图
2019/10/18 Python
浅谈TensorFlow中读取图像数据的三种方式
2020/06/30 Python
Python生成器传参数及返回值原理解析
2020/07/22 Python
canvas实现飞机打怪兽射击小游戏的示例代码
2018/07/09 HTML / CSS
挪威手表购物网站:Klokker
2016/09/19 全球购物
房地产出纳岗位职责
2013/12/01 职场文书
关于赌博的检讨书
2014/01/24 职场文书
团队口号大全
2014/06/06 职场文书
党员干部作风建设思想汇报范文
2014/10/25 职场文书
2015年党员岗位承诺书
2015/04/27 职场文书
员工福利申请报告
2015/05/15 职场文书
信息技术国培研修日志
2015/11/13 职场文书
2019个人工作态度自我评价
2019/04/24 职场文书
python b站视频下载的五种版本
2021/05/27 Python
Python实现为PDF去除水印的示例代码
2022/04/03 Python
vue本地构建热更新卡顿的问题“75 advanced module optimization”完美解决方案
2022/08/05 Vue.js