subprocess 主要用于执行外部命令和程序, 极大的增强了Python的功能。

比如你要用bowtie, 你可以在python中调用这个程序。

运行python时,我们都是在创建并运行一个进程, 一个进程又可以fork, exec另一个进程,这个进程为前一个进程的子进程,在这里python是父进程, 调用bowtie的进程是子进程。

几个封装函数:

1, call()

父进程等待子进程完成, 如果没有出现错误,返回returncode 0

eg:

subprocess.call('samtools view -H %s'%'p2_checkSNP.bam', shell=True)

>>> call('cd ..', shell=True)
0                                      #子进程正常结束,返回returncode 0
>>> call('ls ..', shell=True)
AHRD    auto_ahrd.py       matplotlib  vcf_filter     vcfclass     
CBIISS  call_snp_pipeline  vcf_diff    vcf_statistic
0                                     #子进程正常结束,返回returncode 0

2, check_call()

父进程等待子进程完成, 并且会检查退出信息,如果returncode 不是0, 会举出subprocess.CallProcessError错误。所以可以利用try,...except...来检查

>>> obj = check_call('ls .', shell = True)
bar_plot.py             findAbase.py       line_plot.py
callbase.py             genotyperange      p2_checkSNP.bam
callbase_HTSeq.py       genotyperange.py   p2_checkSNP.bam.bai
callbasepipe            genotyperange.pyc  split_vcf.py
compare_accuracy        getRAlist.py
concatenate_results.py  inter_vcf.py
>>> obj
0

3,check_output()

父进程等待子进程完成, 返回子进程向标准输出的输出结果。也会检查退出信息,如果不为0,举出subprocess.CallProcessError错误。

该对象有returncode 和 output 属性。output为标准输出结果

服务器的python版本是2.6.6 不能用!2.7.6可以用。。。。

上面的三个函数都是基于Popen的封装。封装只是为了让我们更容易使用,功能最全的还是要用Popen类。该类生成的对象用来代表子进程。对象创建后,主程序不会等待子进程完成。

如果想让主程序等待子进程完成后再执行,必须调用对象的wait()方法。

##########################################################

#/usr/lib/python
  
  import subprocess
  child = subprocess.Popen('ls .', shell = True)
  print 'wo zai child hou mian!'

执行:

wo zai child hou mian!                     #你会看到print语句并没有等待fork的子进程结束就先执行了
bar_plot.py        concatenate_results.py  getRAlist.py         split_vcf.py
callbase.py        findAbase.py            inter_vcf.py         testsubprocess
callbase_HTSeq.py  genotyperange           line_plot.py
callbasepipe       genotyperange.py        p2_checkSNP.bam
compare_accuracy   genotyperange.pyc       p2_checkSNP.bam.bai

##########################################################

#/usr/lib/python
 
 import subprocess
 child = subprocess.Popen('ls .', shell = True)
 child.wait()                 #调用了wait方法
 print 'wo zai child hou mian!'

bar_plot.py        concatenate_results.py  getRAlist.py         split_vcf.py
callbase.py        findAbase.py            inter_vcf.py         testsubprocess
callbase_HTSeq.py  genotyperange           line_plot.py
callbasepipe       genotyperange.py        p2_checkSNP.bam
compare_accuracy   genotyperange.pyc       p2_checkSNP.bam.bai
wo zai child hou mian!            #你可以看到print等到子进程结束后才执行。

下面说一下对子进程的文本流控制

子进程的标准输入,标准输出,标准错误:

child.stdin

child.stdout

child.stderr

可以用subprocess.PIPE将多个子进程的输入和输出连接在一起。构成管道pipe

subprocess.PIPE 其实是为文本流提供一个缓存区,各个子进程可以在缓存区读取写入数据,直到communicate方法取出缓存区的文本。communicate()是Popen对象的一个方法,该方法会阻塞父进程,直到子进程完成。

########################################################

#/usr/lib/python
 
  import subprocess
  child = subprocess.Popen('ls .', shell = True, stdout=subprocess.PIPE)
  out = child.communicate()  #返回chid的标准输出和标准错误输出,是一个元组,第一个元素为标准输出,字符串。第二个是标准错误输出,如果没有错误的话就是None. 
  print out
  print 'wo zai ob j hou mian!'

('bar_plot.py\ncallbase.py\ncallbase_HTSeq.py\ncallbasepipe\ncompare_accuracy\nconcatenate_results.py\nfindAbase.py\ngenotyperange\ngenotyperange.py\ngenotyperange.pyc\ngetRAlist.py\ninter_vcf.py\nline_plot.py\np2_checkSNP.bam\np2_checkSNP.bam.bai\nsplit_vcf.py\ntestsubprocess\n', None)            #没有错误,所以元组的第二个元素是None。
wo zai ob j hou mian!         #print 语句等待了子进程的结束才输出。因为communicate会阻塞父进程

#########################################################

#/usr/lib/python
  
   import subprocess
   child1 = subprocess.Popen('ls .', shell = True, stdout=subprocess.PIPE)           #将标准输出放到缓存区
   child2 = subprocess.Popen('ls -hl', shell = True, stdin=child1.stdout)  #标准输入为child1的标准输出, 如果想要将child2的标准输出不显示, 也可以放到subprocess.PIPE缓存区中,供下游使用。如果想要去除child2的标准输出,可以用child2.stdout.read()方法。只取出标准输出,而不用取出含有标准错的元组。等价于child2.communicate()[0], 即元组的第一个元素。

print 'wo zai ob j hou mian!'

by freemao

FAFU

free_mao@qq.com

subprocess module的更多相关文章

  1. 【Python】 Subprocess module

    1. subprocess.check_output() 2.subprocess.call() 3. subprocess.check_call() the methods 1.2.3 are ar ...

  2. Python(文件、文件夹压缩处理模块,shelve持久化模块,xml处理模块、ConfigParser文档配置模块、hashlib加密模块,subprocess系统交互模块 log模块)

    OS模块 提供对操作系统进行调用的接口 os.getcwd() 获取当前工作目录,即当前python脚本工作的目录路径 os.chdir("dirname")  改变当前脚本工作目 ...

  3. ImportError: No module named 'commands'

    /*********************************************************************** * ImportError: No module na ...

  4. Python学习笔记——基础篇【第六周】——Subprocess模块

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

  5. Working with Python subprocess - Shells, Processes, Streams, Pipes, Redirects

    Posted: 2009-04-28 15:20 Tags: Python Note Much of the "What Happens When you Execute a Command ...

  6. Python之子进程subprocess模块

    http://www.cnblogs.com/vamei/archive/2012/09/23/2698014.html http://blog.csdn.net/jgood/article/deta ...

  7. Python调用外部程序——os.system()和subprocess.call

    通过os.system函数调用其他程序 预备知识:cmd中打开和关闭程序 cmd中打开程序 a.打开系统自带程序 系统自带的程序的路径一般都已加入环境变量之中,只需在cmd窗口中直接输入程序名称即可. ...

  8. python 关于操作文件的相关模块(os,sys,shutil,subprocess,configparser)

    一:os模块 os模块提供了许多允许你程序与操作系统直接交互的功能 os.getcwd() 获取当前工作目录,即当前python脚本工作的目录路径 os.chdir("dirname&quo ...

  9. 调用系统命令之subprocess模块

    除了常见的os.system和os.popen方法,官方强烈推荐使用subprocess来调用系统命令. 这个库用起来其实很简单,按照惯例先贴一下官文关键点: The subprocess modul ...

随机推荐

  1. linux查找文件命令find

    http://blog.csdn.net/ydfok/article/details/1486451 find 路径 -name'文件名' 如:find / -name '*dhcp*'

  2. 联系人的侧边字母索引ListView 将手机通讯录姓名通过首字母排序。

      package com.lixu.letterlistview; import java.util.ArrayList; import java.util.List; import org.apa ...

  3. 转: 详解css中的display属性

    在一般的CSS布局制作时候,我们常常会用到display对应值有block.none.inline这三个值.下面我们来分别来认识和学习什么时候用什么值.这里通过CSS display知识加实例讲解方法 ...

  4. 十大谷歌Google搜索技巧分享

    前言:多数人在使用Google搜索的过程是非常低效和无谓的,如果你只是输入几个关键词,然后按搜索按钮,你将是那些无法得到Google全部信息的用户,在这篇文章中,Google搜索专家迈克尔.米勒将向您 ...

  5. 使用ASP.Net WebAPI构建REST服务(五)——客户端

    WebAPI是标准的Http协议,支持Http协议的客户端(如浏览器)都可以访问.但是,有的时候我们如果想在自己的程序中使用WebAPI时,此时就要实现自己的客户端了.我之前介绍过在.Net 4.5中 ...

  6. http://www.html-js.com/article/2328

    React.js编程思想 张小俊128 发布在使用React.js开发web应用2015年8月7日view:33385React 在文章任何区域双击击即可给文章添加[评注]!浮到评注点上可以查看详情. ...

  7. BeanUtils组件

    引入jar包(需要引入依赖的日志jar包) Person p = new Person(); p.setName("Daisy"); p.setAge(12); //对象的copy ...

  8. HTML5实战教程———开发一个简单漂亮的登录页面

    最近看过几个基于HTML5开发的移动应用,比如臭名昭著的12036移动客户端就是主要使用HTML5来实现的,虽然还是有点反应迟钝,但已经比较流畅了,相信随着智能手机的配置越来越高性能越来越好,会越来越 ...

  9. php获取远程文件大小

    获取本地文件大小filesize()就可以了,但是如何获取远程文件的大小呢? 这里介绍三个方法来获取远程文件的大小. 方法1:get_headers <?php get_headers($url ...

  10. poj1276 多重背包

    //Accepted 1100 KB 47 ms //多重背包 #include <cstdio> #include <cstring> #include <iostre ...