子进程管理模块subprocess

subprocess模块允许你生成子进程,连接管道,并获取返回的代码。

一.使用subprocess模块

模块中定义了一个Popen类:

      subprocess.Popen(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的第一个元素,但是也可以通过executable来显示声明。如果显示声明了args,参数序列的第一个元素依然被大多数程序作为命令名。

  1. >>>import shlex, subprocess
  2. >>> command_line = raw_input()
  3. /bin/vikings -input eggs.txt -output "spam spam.txt"-cmd "echo ‘$MONEY‘"
  4. >>> args = shlex.split(command_line)
  5. >>>print args
  6. [‘/bin/vikings‘,‘-input‘,‘eggs.txt‘,‘-output‘,‘spam spam.txt‘,‘-cmd‘,"echo ‘$MONEY‘"]
  7. >>> p = subprocess.Popen(args)# Success!

在Unix中,如果shell=false(默认情况下),那么Popen使用os.execvp()来执行子程序,args应该是参数序列。如果shell=true,如果args是字符串,那么这个字符串必须跟在命令行中输入的字符串一样;如果是参数序列,第一个元素指定为命令行字符串,剩下的元素就被视为参数,也就是说,相当于以下的命令。

  1. Popen([‘/bin/sh‘,‘-c‘, args[0], args[1],...])

而在Window中,Popen使用CreateProcess()来执行子程序,传递的args为字符串,如果arg是参数序列,将会自动调用list2cmdline()转化成字符串。

  bufsize:0意味着无缓存(默认值),1意味着行缓存,其他正整数意味着使用这个整数大小作为缓存大小。负整数意味着使用系统默认的值,通常意味着全缓存。

executable:指定要执行的程序,一般不需要。

 stdin、stdout、stderr:指定程序的标准输出,标准输入,标准错误输出。可能值为管道或者文件描述符,文件对象,或者None。stderr可以为STDOUT,意思是错误信息页通过标准输出输出。

  preexec_fn:可调用对象,在程序执行前调用,只有Unix下可用。

 close_fds:如果为True,所有的文件描述符(除了0,1,2)在子进程运行前都得关闭。(只有Unix下可用)。

 shell:如果为True,指定的命令将通过shell来执行。

cwd:如果不是None,那么子进程当前的目录在执行前会切换到cwd,注意当搜索可执行文件的时候不是根据这个目录来查找的,所以不能针对这个目录来指定相对路径。

env:如果非None,必须是一个映射,定义了针对这个子进程的环境变量。

 univerval_newline:如果为True,则所有平台使用通用的换行符‘\n‘。

 startupinfo、creationflag:仅针对windows有效。

subprocess.PIPE:可以传递给stdin、stdout、stderr的特殊值。

subprocess.STDOUT:可以传递给stderr,表示错误信息通过stdout输出。

     1.实用方法

模块提供了两个实用方法。

 subprocess.call(*popenargs, **kwargs)

使用给定参数运行命令,等待命令执行完,然后返回返回码。给定的参数跟Popen的参数一样。例如  

  1. >>> retcode = subprocess.call(["ls","-l"])

     subprocess.check_call(*popenargs, **kwargs)

使用给定参数运行命令,等待命令执行完,如果返回码为0,则返回它,如果非0,则将抛出CalledProcessError,这个对象里面有returncode属性。需要的参数跟Popen的一样。例如

  1. >>> subprocess.check_call(["ls","-l"])
  2. 0

  subprocess.check_output(*popenargs, **kwargs)

运行命令并返回结果,结果为字符串形式。如果返回码非0,将抛出CalledProcessError异常,需要的参数跟Popen一样。

  1. >>> subprocess.check_output(["ls","-l","/dev/null"])
  2. ‘crw-rw-rw- 1 root root 1, 3 Oct 18 2007 /dev/null\n‘

如果想捕获异常信息,可以使用stderr=subprocess.STDOUT。

  1. >>> subprocess.check_output(
  2. ...["/bin/sh","-c","ls non_existent_file; exit 0"],
  3. ... stderr=subprocess.STDOUT)
  4. ‘ls: non_existent_file: No such file or directory\n‘

     2.异常

异常在子进程中抛出,异常还有一个格外的属性,child_traceback。最常见的异常是OSError。例如执行一个不存在的文件。当Popen使用一个非法的参数时,抛出ValueError异常,check_output()会抛出CalledProcessError。

     二、Popen对象

Popen对象有如下方法。

Popen.poll() :检查子进程是否被中断,设置并返回返回码。

Popen.wait():等待子程序运行完,设置并返回返回码。

Popen.communicate(input=None):与子进程进行通信。输入信息到stdin,从stdout和stderr中读取信息。知道文件末尾。等待进程执行完,可选参数是个字符串,是输入给子进程的信息,如果为None,则意味着不需要发送信息给子进程。这个方法返回一个元组(stdoutdata, stderrdata),注意,如果你想发送信息给子进程,必须在创建Popen的时候使用stdin=PIPE,同样,如果想从stdout和stderr中获取信息,也需要设置它们为PIPE。

Popen.send_signal(signal):给子进程发送信号。

Popen.terminate():终止子进程

Popen.kill():杀死子进程。

Popen.stdin:子进程的标准输入

Popen.stdout:子进程的标准输出。

Popen.stderr:子进程的标准错误输出。

Popen.pid:子进程的ID。

Popen.returncode:子进程的返回码

三、示例。

通过subprocess,可以在python中间接的执行shell命令。以下例子均假设已经运行了from subprocess import * 命令。

例1:间接执行反引号语句

  1. output=`mycmd myarg`
  2. ==>
  3. output =Popen(["mycmd","myarg"], stdout=PIPE).communicate()[0]

例2:间接执行shell管道命令

  1. output=`dmesg | grep hda`
  2. ==>
  3. p1 =Popen(["dmesg"], stdout=PIPE)
  4. p2 =Popen(["grep","hda"], stdin=p1.stdout, stdout=PIPE)
  5. output = p2.communicate()[0]

例3:间接执行os.system()

  1. sts = os.system("mycmd"+" myarg")
  2. ==>
  3. p =Popen("mycmd"+" myarg", shell=True)
  4. sts = os.waitpid(p.pid,0)[1]

通过通过返回码判断命令是否运行成功。

  1. try:
  2. retcode = call("mycmd"+" myarg", shell=True)
  3. if retcode <0:
  4. print>>sys.stderr,"Child was terminated by signal",-retcode
  5. else:
  6. print>>sys.stderr,"Child returned", retcode
  7. exceptOSError, e:
  8. print>>sys.stderr,"Execution failed:", e

来自为知笔记(Wiz)

时间: 2024-08-03 15:40:32

子进程管理模块subprocess的相关文章

python子进程模块subprocess详解与应用实例 之一

subprocess--子进程管理器? 一.subprocess 模块简介 subprocess最早是在2.4版本中引入的. subprocess模块用来生成子进程,并可以通过管道连接它们的输入/输出/错误,以及获得它们的返回值. 它用来代替多个旧模块和函数: os.system os.spawn* os.popen* popen2.* commands.* 关于这个模块可以取代的旧函数可以参见 subprocess-replacements 一节. POSIX用户(Linux, BSD, et

python子进程模块subprocess详解

属性 1.Popen.poll():用于检查子进程是否已经结束.设置并返回returncode属性. 2.Popen.wait():等待子进程结束.设置并返回returncode属性. 3.Popen.communicate(input=None):与子进程进行交互.向stdin发送数据,或从stdout和stderr中读取数据.可选参数input指定发送到子进程的参数.Communicate()返回一个元组:(stdoutdata, stderrdata).注意:如果希望通过进程的stdin向

Python基础篇【第6篇】: Python模块subprocess

subprocess Python中可以执行shell命令的相关模块和函数有: os.system os.spawn* os.popen*          --废弃 popen2.*           --废弃 commands.*      --废弃,3.x中被移除 import commands result = commands.getoutput('cmd') result = commands.getstatus('cmd') result = commands.getstatus

常用模块——subprocess模块

subprocess模块 subprocess主要用于执行系统指令(启动子进程)与os.system 的不同在于 #subprocess可以与这个子进程进行数据交换. import subprocess #从管道中读取数据 管道就是 两个进程通讯的媒介 cmd = r'dir F:\Python_exe' res = subprocess.Popen(cmd,shell=True,stdout=subprocess.PIPE)#cmd 命令语句 shell选项 stdout输出正确管道 prin

slf4j+logback搭建超实用的日志管理模块

文章转自http://www.2cto.com/kf/201702/536097.html slf4j+logback搭建超实用的日志管理模块(对日志有编号管理):日志功能在服务器端再常见不过了,我们非常有必要记录下发生在服务器上的活动,这些日志将用于debug.统计等各种用途. slf4j+logback这种实现方式是很常见的,好处自然是方便!.在这篇文章中,你将看到如何使用logback搭建你自己的日志组件并将日志输出到文件.如何查看这些文件.如何为每个线程上的访问分配独有的一个日志id.

Django Admin后台管理模块的使用

Admin后台管理模块的使用 Django的管理员模块是Django的标准库django.contrib的一部分.这个包还包括其它一些实用的模块: django.contrib.auth django.contrib.sessions django.contrib.comments 激活admin模块的方法是: 1. 在INSTALLED_APPS设置文件中,加入'django.contrib.admin' 2. 再添加 'django.contrib.auth', 'django.contri

基于phpcms v9开发的微信公众号平台管理模块

前沿 在公司为一家酒店联盟开发了一个微信公众号平台,期间因为要赶做其它项目,停停顿顿,整整 改改估计用在开发微信模块的时间大概一个多月,前期的开发基本上已经完成,因为这个微信公众号管理平台是在运用phpcms v9开发的,是phpcms v9的一个模块,所以给它取一个名称,就叫phpcmsv9-weinxin吧. 先上图 phpcmsv9-weinxin模块介绍 之所以叫做微信模块,是因为它是基于phpcms v9的一个插件,安装与卸载随性所欲.phpcms v9是中国领先的内容管理系统,将微信

RDIFramework.NET ━ .NET快速信息化系统开发框架 V3.2-&gt;用户管理模块新增“重置用户密码”功能

不管是什么系统登录用户都有忘记密码的时候,忘记密码就进入不了系统.系统应该可以提供重置用户密码的功能.在我们框架中重置用户密码功能一般用用户管理员来完成.当然如果做得复杂点还可以由用户自己来重置(如:通过邮件.手机短信等方式).RDIFramework.NET V3.2版本新增了用户重置密码的服务接口以供调用,同时在框架Web与WinForm版本的"用户管理"模块分别新增了"重置密码"的功能.用户忘记密码后只需要通知管理员,让管理员通用用户管理模块重置用户的密码为系

网上图书商城项目学习笔记-031图书管理模块介绍及添加图书

一.流程分析 1.图书管理模块介绍 2. 3. 4.添加图书第一步 5.添加图书第二步 二.代码 1.view层 (1)body.jsp 1 <body> 2 <h1 align="center">图书管理</h1> 3 <p align="center"> 4 <a href="<c:url value='/admin/AdminBookServlet?method=addPre'/>&q