Python标准库:子进程 (subprocess包)

来源:互联网 发布:淘宝微淘买家秀怎么发 编辑:程序博客网 时间:2024/05/03 15:03

subprocess包主要功能是执行外部的命令和程序,比如执行linux命令并得到输出结果,另外subprocess还提供了一些管理标准流(standard stream)和管道(pipe)的工具,从而在进程间使用文本通信

类似于fork()函数和exec函数() ,但是封装了更多更强大的功能。

1.常用函数

(1)、subprocess.call()

父进程等待子进程完成

返回退出信息(returncode,相当于exit code)

(2)、subprocess.check_call()

父进程等待子进程完成

返回0

检查退出信息,如果returncode不为0,则举出错误subprocess.CalledProcessError,该对象包含有returncode属性,可用try...except...来检查(见Python错误处理)。

(3)、subprocess.check_call()

父进程等待子进程完成

返回子进程向标准输出的输出结果

检查退出信息,如果returncode不为0,则举出错误subprocess.CalledProcessError,该对象包含有returncode属性和output属性,output属性为标准输出的输出结果,可用try...except...来检查。

代码

import subprocessrc = subprocess.call(["ls","-l"], shell=True)

会在shell输出


import subprocessrc = subprocess.check_call(["ls","-l"], shell=True)print(rc)


输出rc=0


2.Popen() 

与上面的封装不同,Popen对象创建后,主程序不会自动等待子进程完成。我们必须调用对象的wait()方法,父进程才会等待 (也就是阻塞block):l

import subprocesschild = subprocess.Popen(["sleep", "2"])print("I am parent")

会直接执行
print("I am parent")

方法:
child.poll() # 检查子进程状态
child.kill() # 终止子进程
child.send_signal() # 向子进程发送信号
child.terminate() # 终止子进



3.子进程的文本流控制

<span style="font-size:14px;">#主要有三个属性#child.stdin#child.stdout#child.stderrimport subprocesschild1 = subprocess.Popen(["uname","-a"], stdout=subprocess.PIPE)child2 = subprocess.Popen(["wc"], stdin=child1.stdout,stdout=subprocess.PIPE)out = child1.communicate()print(out)out = child2.communicate()print(out)#subprocess.PIPE将多个子进程的输入和输出连接在一起,构成管道(pipe)#subprocess.PIPE实际上为文本流提供一个缓存区。child1的stdout将文本输出到缓存区,#随后child2的stdin从该PIPE中将文本读取走。child2的输出文本也被存放在PIPE中,直到communicate()方法从PIPE中读取出PIPE中的文本。#要注意的是,communicate()是Popen对象的一个方法,该方法会阻塞父进程,直到子进程完成。</span>


输出:
(b'Linux leo 3.16.0-4-amd64 #1 SMP Debian 3.16.36-1+deb8u1 (2016-09-03) x86_64 GNU/Linux\n', None)
(b'      0       0       0\n', None)


0 0
原创粉丝点击