subprocess module
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的更多相关文章
- 【Python】 Subprocess module
1. subprocess.check_output() 2.subprocess.call() 3. subprocess.check_call() the methods 1.2.3 are ar ...
- Python(文件、文件夹压缩处理模块,shelve持久化模块,xml处理模块、ConfigParser文档配置模块、hashlib加密模块,subprocess系统交互模块 log模块)
OS模块 提供对操作系统进行调用的接口 os.getcwd() 获取当前工作目录,即当前python脚本工作的目录路径 os.chdir("dirname") 改变当前脚本工作目 ...
- ImportError: No module named 'commands'
/*********************************************************************** * ImportError: No module na ...
- Python学习笔记——基础篇【第六周】——Subprocess模块
执行系统命令 可以执行shell命令的相关模块和函数有: os.system os.spawn* os.popen* --废弃 popen2.* --废弃 com ...
- 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 ...
- Python之子进程subprocess模块
http://www.cnblogs.com/vamei/archive/2012/09/23/2698014.html http://blog.csdn.net/jgood/article/deta ...
- Python调用外部程序——os.system()和subprocess.call
通过os.system函数调用其他程序 预备知识:cmd中打开和关闭程序 cmd中打开程序 a.打开系统自带程序 系统自带的程序的路径一般都已加入环境变量之中,只需在cmd窗口中直接输入程序名称即可. ...
- python 关于操作文件的相关模块(os,sys,shutil,subprocess,configparser)
一:os模块 os模块提供了许多允许你程序与操作系统直接交互的功能 os.getcwd() 获取当前工作目录,即当前python脚本工作的目录路径 os.chdir("dirname&quo ...
- 调用系统命令之subprocess模块
除了常见的os.system和os.popen方法,官方强烈推荐使用subprocess来调用系统命令. 这个库用起来其实很简单,按照惯例先贴一下官文关键点: The subprocess modul ...
随机推荐
- ZOJ 3645 BiliBili 高斯消元 难度:1
http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId=4835 由题意,有: (x1-x11)^2 + (x2-x12)^2 ... = ...
- sdut 2605 A^X mod P
http://acm.sdut.edu.cn/sdutoj/problem.php?action=showproblem&problemid=2605 这个题卡的是优化,直观解法是在求x^y时 ...
- WDCP安装常用组件(memcache、mysqli、PDO_MYSQL、mysql innodb、libmcrypt、php zip)的方法
为有更好的性能,也为更简洁的系统,一些不是常用或不是基本的功能,都将做为可选的安装组件需要用到的就安装 注意:如果安装时遇到 ./configure: Permission denied提示,很有可能 ...
- 分享第一次使用ProcessOn心得
最近朋友推荐了我一款在线作图工具ProcessOn,感受使用了几天感觉确实很不错,在这里给大家分享一下! ProcessOn应该算的上是第一款完全免费在线作图工具,之前用过国外有类似的,不过都是付费的 ...
- 类似github的框架
github是程序员经常上的网站,但如果是在一家苦逼不能访问外网的公司,那不能把自己的代码托管在github上绝对是一件非常痛苦的事情.如果想要在公司内网也可以用github托管自己的代码,那就要自己 ...
- sidePagination: "server"和responseHandler: responseHandler
bootstrapTable()中有两个属性 一个是sidePagination,表示服务器分页,responseHandler:responseHandler 表示回应操作的rows和total 两 ...
- PAT 07-0 写出这个数
用拼音输出一个数字的各位数字之和,这个或许比上面的标题恰当.这里我第一次用到了sprintf()(stdio.h)这个函数,我本来是要找itoa()(stdlib.h)函数来着,查资料一看,说这个函数 ...
- JS原生回到顶部效果
// 回到顶部 onload = function () { var oBtnTop = document.getElementById('toTop'); var timer = null; oBt ...
- win7下利用笔记本无线网卡创建AP 组建无线局域网(可以连魔兽,TCP、UDP也没问题)
转自:http://blog.163.com/fghok_018/blog/static/122599670201072773924530/ 近一个月,宿舍的好多同学都买了笔记本电脑,当然,我也买了, ...
- SQL server 与Oracle开发比较
●概念上区别 1.Oracle 是一种对象关系数据库管理系统(ORDBMS),而Sql server 只是关系型数据库管 理系统(RDBMS). 2.Oracle使用Internet文件系统,该系统基 ...