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
        

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

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

    subprocess--子进程管理器 一.subprocess 模块简介 subprocess最早是在2.4版本中引入的. subprocess模块用来生成子进程,并可以通过管道连接它们的输入/输出/ ...

  2. python子进程模块subprocess详解

    subprocess--子进程管理器一.subprocess 模块简介subprocess最早是在2.4版本中引入的.subprocess模块用来生成子进程,并可以通过管道连接它们的输入/输出/错误, ...

  3. python模块:调用系统命令模块subprocess等

    http://blog.csdn.net/pipisorry/article/details/46972171 Python经常被称作"胶水语言",因为它能够轻易地操作其他程序,轻 ...

  4. Python 调用系统命令的模块 Subprocess

    Python 调用系统命令的模块 Subprocess 有些时候需要调用系统内部的一些命令,或者给某个应用命令传不定参数时可以使用该模块. 初识 Subprocess 模块 Subprocess 模块 ...

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

    subprocess Python中可以执行shell命令的相关模块和函数有: os.system os.spawn* os.popen*          --废弃 popen2.*         ...

  6. Python第十一天 异常处理 glob模块和shlex模块 打开外部程序和subprocess模块 subprocess类 Pipe管道 operator模块 sorted函数 os模块 hashlib模块 platform模块 csv模块

    Python第十一天    异常处理  glob模块和shlex模块    打开外部程序和subprocess模块  subprocess类  Pipe管道  operator模块   sorted函 ...

  7. os模块,os.path模块,subprocess模块,configparser模块,shutil模块

    1.os模块 os表示操作系统该模块主要用来处理与操作系统相关的操作最常用的文件操作打开 读入 写入 删除 复制 重命名 os.getcwd() 获取当前执行文件所在的文件夹路径os.chdir(&q ...

  8. 【转】Python模块subprocess

    subprocess 早期的Python版本中,我们主要是通过os.system().os.popen().read()等函数.commands模块来执行命令行指令的,从Python 2.4开始官方文 ...

  9. configparser模块 subprocess 模块,xlrd 模块(表格处理)

    今日内容: 1.configparser模块 2.subprocess模块 3.xlrd(读),xlwt(写) 表格处理 configparser模块 import configparser # co ...

随机推荐

  1. SQL Server Mysql 对null值理解的不同

    在说到对null值的理解主要是用unique来体现的.也是说null在unique约束看来是一个值还是多个值的问题. 还是开始实验吧. MYSQL create table t(x int ,cons ...

  2. 最长回文子串 | 勇幸|Thinking

    最长回文子串 | 勇幸|Thinking 最长回文子串

  3. UVA-548Tree(二叉树的递归遍历)

    Tree Time Limit: 3000MS   Memory Limit: Unknown   64bit IO Format: %lld & %llu Submit Status Des ...

  4. ubuntu 14.04设备flash媒体播放器

    今天是2014年4一个月19日本,就在两天前公布 ubuntu 14.04版本号, 以今天的优势是星期六,西安小雨,所以折腾linux. 我是个有点linux基础的小白.说是有些基础是由于以前在上大学 ...

  5. 关于MVC EntityType has no key defined的问题

    关于MVC EntityType has no key defined的问题 在测试MVC时发现一个奇怪的问题,在Model中定义数据类时,如 public class UserInfo { publ ...

  6. iOS:原生二维码扫描

    做iOS的二维码扫描,有两个第三方库可以选择,ZBar和ZXing.今天要介绍的是iOS7.0后AVFoundation框架提供的原生二维码扫描. 首先需要添加AVFoundation.framewo ...

  7. java中如何计算两个时间段的月份差

    直接计算,先取得两个日期的年份和月份,月份差=(第二年份-第一年份)*12 + 第二月份-第一月份

  8. 原生javascript实现老.虎机抽奖点名demo源码思路解析

    想着使用原生Javascript做一个随机点名的小应用, 也可以做抽奖使用. html简单化,人名单可以通过js生成并处理. 可以非常随意的添加修改人名字. 应用想带点特效,比如老.虎机转动的特效. ...

  9. Java "JSON中无分隔符日期字符串处理"

    Json 中日期类型数据处理,服务端传输的日期没有分隔符,一般格式就两种,[20151212121212]即yyyyMMddhhmmss和[121212]hhmmss import java.text ...

  10. Android 开发笔记“Application 理解”

    Android 中Application类用法 1.             Application和Activity,Service一样是Android框架的一个系统组件,当Android程序启动时 ...