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 urlopen()函数 示例分享
Jun 12 Python
Python3中多线程编程的队列运作示例
Apr 16 Python
python实现的简单RPG游戏流程实例
Jun 28 Python
python http接口自动化脚本详解
Jan 02 Python
python psutil库安装教程
Mar 19 Python
Python正则表达式和元字符详解
Nov 29 Python
python找出一个列表中相同元素的多个索引实例
Jun 11 Python
Django文件存储 自己定制存储系统解析
Aug 02 Python
python网络编程 使用UDP、TCP协议收发信息详解
Aug 29 Python
keras 读取多标签图像数据方式
Jun 12 Python
详解Python函数print用法
Jun 18 Python
Python使用MapReduce进行简单的销售统计
Apr 22 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
第十四节 命名空间 [14]
2006/10/09 PHP
PHP setcookie设置Cookie用法(及设置无效的问题)
2011/07/13 PHP
php实现memcache缓存示例讲解
2013/12/04 PHP
smarty内置函数capture用法分析
2015/01/22 PHP
使用PHP连接多种数据库的实现代码(mysql,access,sqlserver,Oracle)
2016/12/21 PHP
YII2框架中actions的作用与使用方法示例
2020/03/13 PHP
ExtJS 2.0实用简明教程之应用ExtJS
2009/04/29 Javascript
JS保留小数点(四舍五入、四舍六入)实现思路及实例
2013/04/25 Javascript
jQuery使用hide方法隐藏指定元素class样式用法实例
2015/03/30 Javascript
javascript实现网页中涉及的简易运动(改变宽高、透明度、位置)
2015/11/29 Javascript
全屏滚动插件fullPage.js使用实例解析
2016/10/21 Javascript
JSON创建键值对(key是中文或者数字)方式详解
2017/08/24 Javascript
JS实现盒子跟着鼠标移动及键盘方向键控制盒子移动效果示例
2019/01/29 Javascript
JS前端模块化原理与实现方法详解
2020/03/17 Javascript
Vue如何实现监听组件原生事件
2020/07/03 Javascript
[02:03]风行者至宝清风环佩外观展示
2020/09/05 DOTA
python实现巡检系统(solaris)示例
2014/04/02 Python
使用Python制作获取网站目录的图形化程序
2015/05/04 Python
用python做一个搜索引擎(Pylucene)的实例代码
2017/07/05 Python
利用python实现简单的循环购物车功能示例代码
2017/07/05 Python
python ChainMap 合并字典的实现步骤
2019/06/11 Python
CSS3中的5个有趣的新技术
2009/04/02 HTML / CSS
收集的7个CSS3代码生成工具
2010/04/17 HTML / CSS
迪拜航空官方网站:flydubai
2017/04/20 全球购物
德国团购网站:Groupon德国
2018/03/13 全球购物
试用期转正鉴定评语
2014/01/27 职场文书
先进班级集体事迹材料
2014/01/30 职场文书
社区交通安全实施方案
2014/03/22 职场文书
学雷锋活动倡议书
2014/08/30 职场文书
药店采购员岗位职责
2014/09/30 职场文书
民主生活会对照检查材料范文
2014/10/01 职场文书
入党积极分子十八届四中全会思想汇报
2014/10/23 职场文书
工作自我评价范文
2015/03/05 职场文书
离婚纠纷代理词
2015/05/23 职场文书
好人好事新闻稿
2015/07/17 职场文书
vue封装数字翻牌器
2022/04/20 Vue.js