第十章:使用进程、线程和协程提供并发性-subprocess:创建附加进程-直接处理管道-与进程的单向通信

10.1.2 直接处理管道
函数run(),call(),check_call()和check_out()都是Popen类的包装器。直接使用Popen可以更多地控制如何运行命令以及如何处理其输入和输出流。例如,通过为stdin,stdout和stderr传递不同的参数,可以模仿不同形式的os.popen()。

10.1.2.1 与进程的单向通信
要允许一个进程并读取它的所有输出,可以设置stdout值为PIPE并调用communicate()。

import subprocess

print('read:')
proc = subprocess.Popen(
    ['echo','"to stdout"'],
    stdout=subprocess.PIPE,
    )
stdout_value = proc.communicate()[0].decode('utf-8')
print('stdout:',repr(stdout_value))

这与popen()的工作类似,只不过Popen实例会在内部管理数据读取。
运行结果:
在这里插入图片描述
要建立一个管道,以便调用程序写数据,可以设置stdin为PIPE。

import subprocess

print('write:')
proc = subprocess.Popen(
    ['cat','-'],
    stdin=subprocess.PIPE,
    )
proc.communicate('stdin: to stdin\n'.encode('utf-8'))

要将数据一次性发送到进程的标准输入通道,可以把数据传递到communicate()。这类似于使用popen()并指定’w’模式。
运行结果:
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值