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 version 2.7 required, which was not found in the registry
Aug 26 Python
python对数组进行反转的方法
May 20 Python
python 截取 取出一部分的字符串方法
Mar 01 Python
使用Python3制作TCP端口扫描器
Apr 17 Python
python 获取指定文件夹下所有文件名称并写入列表的实例
Apr 23 Python
Python全排列操作实例分析
Jul 24 Python
浅析python的Lambda表达式
Feb 27 Python
Python3转换html到pdf的不同解决方案
Mar 11 Python
Python统计一个字符串中每个字符出现了多少次的方法【字符串转换为列表再统计】
May 05 Python
详解Python 定时框架 Apscheduler原理及安装过程
Jun 14 Python
pytorch多GPU并行运算的实现
Sep 27 Python
Elasticsearch 批量操作
Apr 19 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中实现图片的锐化
2006/10/09 PHP
php实现文件下载更能介绍
2012/11/23 PHP
深入eAccelerator与memcached的区别详解
2013/06/06 PHP
Joomla实现组件中弹出一个模式(modal)窗口的方法
2016/05/04 PHP
php自定义中文字符串截取函数substr_for_gb2312及substr_for_utf8示例
2016/05/28 PHP
php 静态属性和静态方法区别详解
2017/04/09 PHP
Yii框架自定义数据库操作组件示例
2019/11/11 PHP
js里的prototype使用示例
2010/11/19 Javascript
从零开始学习jQuery (八) 插播:jQuery实施方案
2011/02/23 Javascript
读jQuery之七 判断点击了鼠标哪个键的代码
2011/06/21 Javascript
JavaScript面向对象程序设计三 原型模式(上)
2011/12/21 Javascript
Extjs4 Treegrid 使用心得分享(经验篇)
2013/07/01 Javascript
实用的Jquery选项卡TAB示例代码
2013/08/28 Javascript
利用CSS、JavaScript及Ajax实现高效的图片预加载
2013/10/16 Javascript
JS之Date对象和获取系统当前时间详解
2014/01/13 Javascript
使用jQuery的attr方法来修改onclick值
2014/07/07 Javascript
JS实现简单的键盘打字的效果
2015/04/24 Javascript
基于Node.js的强大爬虫 能直接发布抓取的文章哦
2016/01/10 Javascript
深入理解Ajax的get和post请求
2016/06/02 Javascript
ui组件之input多选下拉实现方法(带有搜索功能)
2016/07/14 Javascript
angular+bootstrap的双向数据绑定实例
2017/03/03 Javascript
浅谈nodejs中的类定义和继承的套路
2017/07/26 NodeJs
mpvue构建小程序的方法(步骤+地址)
2018/05/22 Javascript
Vue.js+cube-ui(Scroll组件)实现类似头条效果的横向滚动导航条
2019/06/24 Javascript
vue 使用axios 数据请求第三方插件的使用教程详解
2019/07/05 Javascript
Node.js API详解之 Error模块用法实例分析
2020/05/14 Javascript
[56:47]Ti4 循环赛第三日 iG vs Liquid
2014/07/12 DOTA
Python的高级Git库 Gittle
2014/09/22 Python
Django REST为文件属性输出完整URL的方法
2017/12/18 Python
Under Armour安德玛法国官网:美国高端运动科技品牌
2018/06/29 全球购物
技术总监个人的自我评价范文
2013/12/18 职场文书
培训主管岗位职责
2014/02/01 职场文书
测试工程师职业规划书
2014/02/06 职场文书
幼儿园小班评语大全
2014/04/17 职场文书
检察院对照“四风”认真查找问题落实整改措施
2014/09/26 职场文书
《合作意向书》怎么写?
2019/08/20 职场文书