子进程管理模块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,参数序列的第一个元素依然被大多数程序作为命令名。
>>>import shlex, subprocess>>> command_line = raw_input()/bin/vikings -input eggs.txt -output "spam spam.txt"-cmd "echo '$MONEY'">>> args = shlex.split(command_line)>>>print args['/bin/vikings','-input','eggs.txt','-output','spam spam.txt','-cmd',"echo '$MONEY'"]>>> p = subprocess.Popen(args)# Success!
在Unix中,如果shell=false(默认情况下),那么Popen使用os.execvp()来执行子程序,args应该是参数序列。如果shell=true,如果args是字符串,那么这个字符串必须跟在命令行中输入的字符串一样;如果是参数序列,第一个元素指定为命令行字符串,剩下的元素就被视为参数,也就是说,相当于以下的命令。
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的参数一样。例如
>>> retcode = subprocess.call(["ls","-l"])
subprocess.check_call(*popenargs, **kwargs)
使用给定参数运行命令,等待命令执行完,如果返回码为0,则返回它,如果非0,则将抛出CalledProcessError,这个对象里面有returncode属性。需要的参数跟Popen的一样。例如
>>> subprocess.check_call(["ls","-l"])0
>>> subprocess.check_output(["ls","-l","/dev/null"])'crw-rw-rw- 1 root root 1, 3 Oct 18 2007 /dev/null\n'
>>> subprocess.check_output(...["/bin/sh","-c","ls non_existent_file; exit 0"],... stderr=subprocess.STDOUT)'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:间接执行反引号语句
output=`mycmd myarg`==>output =Popen(["mycmd","myarg"], stdout=PIPE).communicate()[0]
output=`dmesg | grep hda`==>p1 =Popen(["dmesg"], stdout=PIPE)p2 =Popen(["grep","hda"], stdin=p1.stdout, stdout=PIPE)output = p2.communicate()[0]
sts = os.system("mycmd"+" myarg")==>p =Popen("mycmd"+" myarg", shell=True)sts = os.waitpid(p.pid,0)[1]
try:retcode = call("mycmd"+" myarg", shell=True)if retcode <0:print>>sys.stderr,"Child was terminated by signal",-retcodeelse:print>>sys.stderr,"Child returned", retcodeexceptOSError, e:print>>sys.stderr,"Execution failed:", e
子进程管理模块subprocess的更多相关文章
- python子进程模块subprocess详解与应用实例 之一
subprocess--子进程管理器 一.subprocess 模块简介 subprocess最早是在2.4版本中引入的. subprocess模块用来生成子进程,并可以通过管道连接它们的输入/输出/ ...
- python子进程模块subprocess详解
subprocess--子进程管理器一.subprocess 模块简介subprocess最早是在2.4版本中引入的.subprocess模块用来生成子进程,并可以通过管道连接它们的输入/输出/错误, ...
- python模块:调用系统命令模块subprocess等
http://blog.csdn.net/pipisorry/article/details/46972171 Python经常被称作"胶水语言",因为它能够轻易地操作其他程序,轻 ...
- Python 调用系统命令的模块 Subprocess
Python 调用系统命令的模块 Subprocess 有些时候需要调用系统内部的一些命令,或者给某个应用命令传不定参数时可以使用该模块. 初识 Subprocess 模块 Subprocess 模块 ...
- Python基础篇【第6篇】: Python模块subprocess
subprocess Python中可以执行shell命令的相关模块和函数有: os.system os.spawn* os.popen* --废弃 popen2.* ...
- Python第十一天 异常处理 glob模块和shlex模块 打开外部程序和subprocess模块 subprocess类 Pipe管道 operator模块 sorted函数 os模块 hashlib模块 platform模块 csv模块
Python第十一天 异常处理 glob模块和shlex模块 打开外部程序和subprocess模块 subprocess类 Pipe管道 operator模块 sorted函 ...
- os模块,os.path模块,subprocess模块,configparser模块,shutil模块
1.os模块 os表示操作系统该模块主要用来处理与操作系统相关的操作最常用的文件操作打开 读入 写入 删除 复制 重命名 os.getcwd() 获取当前执行文件所在的文件夹路径os.chdir(&q ...
- 【转】Python模块subprocess
subprocess 早期的Python版本中,我们主要是通过os.system().os.popen().read()等函数.commands模块来执行命令行指令的,从Python 2.4开始官方文 ...
- configparser模块 subprocess 模块,xlrd 模块(表格处理)
今日内容: 1.configparser模块 2.subprocess模块 3.xlrd(读),xlwt(写) 表格处理 configparser模块 import configparser # co ...
随机推荐
- qt5集成libcurl实现tftp和ftp的方法一:搭建环境(五篇文章)
最近使用QT5做一个软件,要求实现tftp和ftp文件传输,使用QT5开发好UI界面等功能,突然发现QT5不直接提供tftp和ftp支持,无奈之下只好找第三方库来间接实现,根据网友的介绍,libcur ...
- git 导入代码到已有仓库
git remote add origin https://----------- git push -u origin master //这两行将该目录下的文件推送到远端(origin)上的 &qu ...
- 掌握下面常用函数,学php不再难
一.写入文件 1.打开资源(文件)fopen($filename,$mode) 2.写文件fwrite($handle,$str) 3.关闭文件fclose($handle) 4.一步写入file_p ...
- 国产编程语言R++ V1.5发布
R++ v1.5内核改动较大,下面是一些主要变化: 1.使用PJIT(Pseudocode Just-In-Time),编译速度大幅提高,但运行效率远远不如C++,不过R++将在下一版本支持RJIT( ...
- python中变量命名
一 综述: 二 全局变量(包含函数和类): (1)正常变量x: *通过module.x能够使用. *通过from module import *能够使用. (2)以"_"开头变量 ...
- tomcat的JK和JK2
如今又開始配置JK2,想将Tomcat和apache,但Tomcat上已经不支持对于JK2的开发了,详情请看: Apache-Tomcat mod_jk2 aka JK2 15 November - ...
- $timeout, $interval
$timeout, $interval layout: posttitle: Angular@1.4.3 中文 API 服务篇 $timeout & $intervaldesc: '$ti ...
- setInterval()与clearInterval()的用法
setInterval() 方法可按照指定的周期来调用函数或计算表达式. --简单地说就是过一段时间调用一次该函数 setInterval() 方法会不停地调用函数,直到 clearInterval ...
- objective-c 中随机数的用法 (3种:arc4random() 、random()、CCRANDOM_0_1() )
1.随机数的使用 1).arc4random() 比较精确不需要生成随即种子 使用方法 : 通过arc4random() 获取0到x-1之间的整数的代码如下: int value = arc ...
- 浅谈Servlet(三)
一.三种作用域 作用域:web开发中用于存储和获得数据. 1.request 一次请求有效,在forward跳转时可用request作用域传递数据. 2.session client不变,sessio ...