【发布时间】:2018-06-23 20:37:21
【问题描述】:
我正在遭受 Windows Python 子进程模块的困扰。
这是测试代码1(命名为test1.py):
import subprocess as sbp
with sbp.Popen('python tests/test2.py',stdout=sbp.PIPE) as proc:
print('parent process')
print(proc.stdout.read(1))
print('end.')
和测试代码2(命名为test2.py):
import random
import time
def r():
while True:
yield random.randint(0, 100)
for i in r():
print(i)
time.sleep(1)
一般情况下,测试代码2会生成随机整数(0~100)并无限打印出来。 我希望测试代码1创建一个子进程并启动它,实时读取标准输出(不等待子进程完成)。 但是当我运行代码时,输出是:
python.exe test1.py
parent process
它永远阻塞在 stdout.read() 上。 我试过了:
- 将
stdout.read替换为communicate(),不会像python doc 预期的那样工作,它会阻塞直到子进程终止。 - 使用 poll() 方法检测子进程并读取 n 个字节,在 read() 上永远阻塞
- 修改test2.code,只生成一个nunber并打破循环。父进程立即打印出来(我认为是因为子进程终止了)
我搜索了很多类似的答案并按照他们的建议做了(使用标准输出而不是通信),但仍然没有工作?
谁能帮我解释一下为什么以及怎么做?
这是我的平台信息:
Python 3.6.4 (v3.6.4:d48eceb, Dec 19 2017, 06:54:40) [MSC v.1900 64 bit (AMD64)] on win32
【问题讨论】:
-
有什么理由特别需要
Popen?为什么不使用subprocess.check_output?还是check_output不做实时阅读? -
@NiemaMoshiri 是的,
check_output类似于run,它会返回直到子进程终止。
标签: python python-3.x subprocess