3.3Python之subprocess模块

基本概念

从Python2.4开始,Python引入subprocess模块来管理子进程,以取代旧模块的方法。不但可以调用外部的命令作为子进程,而且可以连接到子进程的input/output/error管道,获取相关的返回信息。

subprocess模块

Python的subprocess模块可以实现子进程。该模块只定义了一个类:Popen。可以使用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:可以是字符串或者序列类型(如:list,元组),用于指定进程的可执行文件及其参数。如果是序列类型,第一个元素通常是可执行文件的路径。也可以显式地使用 execteable参数来指定可执行文件的路径。
  • 参数stdin,stdout,stderr:分别表示程序的标准输入、输出、错误句柄。它们可以是PIPE,文件描述符或文件对象,也可以设置为None,表示从父进程继承。
  • 参数shelll:设置为True,程序将通过shell来执行。
  • 参数env:字典类型,用于指定子进程的环境变量。如果设置为None,表示子进程的环境变量从父进程中继承。

Popen的方法

  • Popen.poll():用于检查子进程是否已经结束。设置并返回returncode属性。
  • Popen.wait():等待子进程结束。设置并返回returncode属性。
  • Popen.communicate(input = None):与子进程交互。向stdin发送数据,或从stdout和stderr中读取数据。可选参数input指定发送到子进程的参数。commuicate()返回一个元组:(stdoutdata, stderrdata)。注意如果希望通过进程的stdin向其发送数据,在创建Popen对象的时候,参数stdin必须设置为PIPE。同理,如果希望从stdout和stderr获取数据,比较将stdout和stderr设置为PIPE。
  • Popep.send_signal(signal):向子进程发送信号。
  • Popen.terminate():停止(stop)子进程。在windows平台下,该方法将调用Windows API TerminateProcess()来结束子进程。
  • Popen.kill():杀死子进程。

subprocess中定义数个创建子进程的函数,这些函数分别以不同的方式创建子进程。

  • subprocess.call():父进程等待子进程完成,返回退出信息(returncode属性)
  • subprocess.check_call():父进程等待子进程完成,返回0。检查退出信息,如果returncode不为0,则举出错误subprocess.calledProcessError,该对象包含了returncode属性。
  • subProcess.check_output():父进程等待子进程完成,返回子进程向标准输出的输出结果。检查退出信息,如果returncode不为0,则举出错误subprocess.calledProcessError,该对象包含了returncode属性。

示例演示

import time, subprocess

if __name__ == '__main__':
    print "start main"
   child = subprocess.Popen(["ping","-c","5","www.csdn.com"])
    print("parent process")
    while True:
        print "parent processing"
        time.sleep(2)

从运行结果看,父进程在开启子进程之后,并没有等待子进程完成,而是直接运行print(“parent process”)。

import time, subprocess
if __name__ == '__main__':
	print "start main"
	child = subprocess.Popen(["ping","-c","5","www.csdn.com"])
	child.wait()
	print("parent process")
	while True:
		print "parent processing"
		time.sleep(2)

从运行结果看,父进程在开启子进程之后等待子进程完成,再运行print(“parent process”)。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值