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中的几种数据类型
Jan 02 Python
python使用Tkinter实现在线音乐播放器
Jan 30 Python
PyQT实现多窗口切换
Apr 20 Python
用Python下载一个网页保存为本地的HTML文件实例
May 21 Python
基于python进行桶排序与基数排序的总结
May 29 Python
Python3.6简单的操作Mysql数据库的三个实例
Oct 17 Python
Python Tkinter模块 GUI 可视化实例
Nov 20 Python
tensorflow 查看梯度方式
Feb 04 Python
Python集合操作方法详解
Feb 09 Python
Python matplotlib绘制图形实例(包括点,曲线,注释和箭头)
Apr 17 Python
python实战之一步一步教你绘制小猪佩奇
Apr 22 Python
Python 线程池模块之多线程操作代码
May 20 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+Ajax检测用户名或邮件注册时是否已经存在实例教程
2014/08/23 PHP
PHP mongodb操作类定义与用法示例【适合mongodb2.x和mongodb3.x】
2018/06/16 PHP
用javascript实现给图片加链接
2007/08/15 Javascript
javascript YUI 读码日记之 YAHOO.util.Dom - Part.4
2008/03/22 Javascript
Javascript 网页水印(非图片水印)实现代码
2010/03/01 Javascript
JS检测图片大小的实例
2013/08/21 Javascript
jquery ajax实现下拉框三级无刷新联动,且保存保持选中值状态
2013/10/29 Javascript
jQuery源码解读之removeClass()方法分析
2015/02/20 Javascript
JS+DIV实现鼠标划过切换层效果的方法
2015/05/25 Javascript
JavaScript中的replace()方法使用详解
2015/06/06 Javascript
jQuery组件easyui基本布局实现代码
2016/08/25 Javascript
jQuery版AJAX简易封装代码
2016/09/14 Javascript
使用JavaScriptCore实现OC和JS交互详解
2017/03/28 Javascript
AngularJS实现的根据数量与单价计算总价功能示例
2017/12/26 Javascript
详解angular2 控制视图的封装模式
2018/12/27 Javascript
Vue的状态管理vuex使用方法详解
2020/02/05 Javascript
Layer UI表格列日期格式化及取消自动填充日期的实现方法
2020/05/10 Javascript
JavaScript编写开发动态时钟
2020/07/29 Javascript
利用JavaScript模拟京东按键输入功能
2020/12/01 Javascript
Python3基础之基本数据类型概述
2014/08/13 Python
Django web框架使用url path name详解
2019/04/29 Python
django框架model orM使用字典作为参数,保存数据的方法分析
2019/06/24 Python
Python read函数按字节(字符)读取文件的实现
2019/07/03 Python
python使用socket 先读取长度,在读取报文内容示例
2019/09/26 Python
django框架ModelForm组件用法详解
2019/12/11 Python
python turtle 绘制太极图的实例
2019/12/18 Python
pandas参数设置的实用小技巧
2020/08/23 Python
python tkinter实现连连看游戏
2020/11/16 Python
请介绍一下Ant
2016/07/22 面试题
最新的大学生找工作自我评价
2013/09/29 职场文书
房屋授权无偿使用证明
2014/11/29 职场文书
2015年元旦主持词开场白
2014/12/14 职场文书
2016年劳模先进事迹材料
2016/02/25 职场文书
python脚本框架webpy模板赋值实现
2021/11/20 Python
解决vue-router的beforeRouteUpdate不能触发
2022/04/14 Vue.js
Spring Boot 实现 WebSocket
2022/04/30 Java/Android