Python subprocess模块详细解读


Posted in Python onJanuary 29, 2018

本文研究的主要是Python subprocess模块的相关内容,具体如下。

在学习这个模块前,我们先用Python的help()函数查看一下subprocess模块是干嘛的:

DESCRIPTION
This module allows you to spawn processes, connect to their
input/output/error pipes, and obtain their return codes.

即允许你去创建一个新的进程让其执行另外的程序,并与它进行通信,获取标准的输入、标准输出、标准错误以及返回码等。
注意:使用这个模块之前要先引入该模块。

Popen类

subprocess模块中定义了一个Popen类,通过它可以来创建进程,并与其进行复杂的交互。查看一下它的构造函数:

__init__(self, args, bufsize=0, executable=None, 
stdin=None, stdout=None, stderr=None, preexec_fn=None, 
close_fds=False, shell=False, cwd=None, env=None, 
universal_newlines=False, startupinfo=None, 
creationflags=0)

主要参数说明:

args:args should be a string, or a sequence of program arguments.也就是说必须是一个字符串或者序列类型(如:字符串、list、元组),用于指定进程的可执行文件及其参数。如果是一个序列类型参数,则序列的第一个元素通常都必须是一个可执行文件的路径。当然也可以使用executeable参数来指定可执行文件的路径。

stdin,stdout,stderr:分别表示程序的标准输入、标准输出、标准错误。有效的值可以是PIPE,存在的文件描述符,存在的文件对象或None,如果为None需从父进程继承过来,stdout可以是PIPE,表示对子进程创建一个管道,stderr可以是STDOUT,表示标准错误数据应该从应用程序中捕获并作为标准输出流stdout的文件句柄。

shell:如果这个参数被设置为True,程序将通过shell来执行。

env:它描述的是子进程的环境变量。如果为None,子进程的环境变量将从父进程继承而来。

创建Popen类的实例对象

res = subprocess.Popen(cmd, shell=True, stdout=subprocess.PIPE, stderr=subprocess.STDOUT)

cmd:标准像子进程传入需要执行的shell命令,如:ls -al

subprocess.PIPE:在创建Popen对象时,subprocess.PIPE可以初始化为stdin, stdout或stderr的参数,表示与子进程通信的标准输入流,标准输出流以及标准错误。

subprocess.STDOUT:作为Popen对象的stderr的参数,表示将标准错误通过标准输出流输出。

Popen类拥有的方法及属性

1、Popen.pid

获取子进程的进程ID。

2、Popen.returncode

获取进程的返回码。如果进程未结束,将返回None。

3、communicate(input=None)

官方解释:

Interact with process: Send data to stdin. Read data from
stdout and stderr, until end-of-file is reached. Wait for
process to terminate. The optional input argument should be a
string to be sent to the child process, or None, if no data
should be sent to the child.

communicate() returns a tuple (stdout, stderr).

与子进程进行交互,像stdin发送数据,并从stdout和stderr读出数据存在一个tuple中并返回。
参数input应该是一个发送给子进程的字符串,如果未指定数据,将传入None。

4、poll()

检查子进程是否结束,并返回returncode属性。

5、wait()

Wait for child process to terminate. Returns returncode attribute.

等待子进程执行结束,并返回returncode属性,如果为0表示执行成功。

6、send_signal( sig)

Send a signal to the process

发送信号给子进程。

7、terminate()

Terminates the process

终止子进程。windows下将调用Windows API TerminateProcess()来结束子进程。

8、kill()

官方文档对这个函数的解释跟terminate()是一样的,表示杀死子进程。

进程通信实例1

打开一个只有ip地址的文本文件,读取其中的ip,然后进行ping操作,并将ping结果写入ping.txt文件中。
首先创建一个子进程res,传入要执行的shell命令,并获得标准输出流、返回码等。

import subprocess
import os
class Shell(object) :
 def runCmd(self, cmd) :
  res = subprocess.Popen(cmd, shell=True, stdout=subprocess.PIPE, stderr=subprocess.STDOUT)
  sout ,serr = res.communicate() 
  return res.returncode, sout, serr, res.pid

shell = Shell()
fp = open('c:\\test\\ip.txt', 'r')
ipList = fp.readlines()
fp.close()
fp = open('c:\\test\\ping.txt', 'a')
print ipList
for i in ipList :
 i = i.strip()
 result = shell.runCmd('ping ' + i)
 if result[0] == 0 :
  w = i + ' : 0'
  fp.write(w + '\n')
 else :
  w = i + ' : 1'
  fp.write(w + '\n')

fp.close()

执行结果:

Python subprocess模块详细解读

进程通信实例2

命令交互,不断从键盘接受命令执行,给出执行结果,直到用户输入exit或者bye退出命令交互。

import subprocess
class Shell(object) :
 def runCmd(self, cmd) :
  res = subprocess.Popen(cmd, shell=True, stdout=subprocess.PIPE, stderr=subprocess.STDOUT)
  sout ,serr = res.communicate()   
  return res.returncode, sout, serr, res.pid

shell = Shell()
while 1 :
 input = raw_input('>')
 if input == 'exit' or input == 'bye' :
  break
 else :
  result = shell.runCmd(input)
  print "返回码:", result[0]
  print "标准输出:", result[1]
  print "标准错误:", result[2]

在Windows上也可以使用os.system()这个函数来执行一些dos命令,但是这个命令只能拿到返回码,拿不到标准输出,标准错误,所以通常使用的subprocess模块中的Popen类来实现。

总结

以上就是本文关于Python subprocess模块详细解读的全部内容,希望对大家有所帮助。感兴趣的朋友可以继续参阅本站其他相关专题,如有不足之处,欢迎留言指出。感谢朋友们对本站的支持!

Python 相关文章推荐
python 自动提交和抓取网页
Jul 13 Python
python实现带声音的摩斯码翻译实现方法
May 20 Python
Django实现的自定义访问日志模块示例
Jun 23 Python
浅谈Python实现贪心算法与活动安排问题
Dec 19 Python
python 时间信息“2018-02-04 18:23:35“ 解析成字典形式的结果代码详解
Apr 19 Python
Django教程笔记之中间件middleware详解
Aug 01 Python
python模糊图片过滤的方法
Dec 14 Python
python采集百度搜索结果带有特定URL的链接代码实例
Aug 30 Python
Python startswith()和endswith() 方法原理解析
Apr 28 Python
keras topN显示,自编写代码案例
Jul 03 Python
Django:使用filter的pk进行多值查询操作
Jul 15 Python
基于Python实现的购物商城管理系统
Apr 27 Python
python微信跳一跳游戏辅助代码解析
Jan 29 #Python
Python面向对象之继承代码详解
Jan 29 #Python
Python多线程threading和multiprocessing模块实例解析
Jan 29 #Python
Python编程scoketServer实现多线程同步实例代码
Jan 29 #Python
Python模块搜索路径代码详解
Jan 29 #Python
python机器人行走步数问题的解决
Jan 29 #Python
python的socket编程入门
Jan 29 #Python
You might like
PHP内核介绍及扩展开发指南―基础知识
2011/09/11 PHP
一个比较不错的PHP日历类分享
2014/11/18 PHP
PHP7.3.10编译安装教程
2019/10/08 PHP
javascript中利用数组实现的循环队列代码
2010/01/24 Javascript
工作需要写的一个js拖拽组件
2011/07/28 Javascript
JavaScript时间操作之年月日星期级联操作
2016/01/15 Javascript
使用vue.js制作分页组件
2016/06/27 Javascript
基于jQuery实现淡入淡出效果轮播图
2020/07/31 Javascript
JS控制静态页面传递参数并获取参数应用
2016/08/10 Javascript
一个简易的js图片轮播效果
2017/07/22 Javascript
vue实现选项卡及选项卡切换效果
2018/04/24 Javascript
Vue对象赋值视图不更新问题及解决方法
2019/06/03 Javascript
Vue修改项目启动端口号方法
2019/11/07 Javascript
使用JS来动态操作css的几种方法
2019/12/18 Javascript
解决pycharm双击但是无法打开的情况
2020/10/31 Javascript
[05:53]完美世界携手游戏风云打造 卡尔工作室观战系统篇
2013/04/22 DOTA
python处理csv数据的方法
2015/03/11 Python
python 实时遍历日志文件
2016/04/12 Python
Python实现重建二叉树的三种方法详解
2018/06/23 Python
python3实现网页版raspberry pi(树莓派)小车控制
2020/02/12 Python
python下载卫星云图合成gif的方法示例
2020/02/18 Python
Python selenium 加载并保存QQ群成员,去除其群主、管理员信息的示例代码
2020/05/28 Python
CSS3制作圆形滚动进度条动画的示例
2020/11/05 HTML / CSS
使用HTML5 Canvas为图片填充颜色和纹理的教程
2016/03/21 HTML / CSS
简述安装Slackware Linux系统的过程
2012/05/08 面试题
工地资料员岗位职责
2013/12/31 职场文书
个人作风纪律整顿整改措施
2014/10/25 职场文书
岗位竞聘报告范文
2014/11/06 职场文书
副校长2015年教育教学工作总结
2015/07/27 职场文书
新郎新娘致辞
2015/07/31 职场文书
治庸问责工作总结
2015/08/11 职场文书
酒桌上的祝酒词
2015/08/12 职场文书
党风廉政建设心得体会(2016最新版)
2016/01/22 职场文书
年终奖金发放管理制度,中小企业适用,拿去救急吧!
2019/07/12 职场文书
Python 数据可视化之Bokeh详解
2021/11/02 Python
教你使用Jenkins集成Harbor自动发布镜像
2022/04/03 Servers