- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正遭受 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正如预期,它将阻塞直到子进程终止。我搜索了很多类似的答案并按照他们的建议做了(使用标准输出而不是通信),但仍然不起作用?
有人可以帮我解释一下为什么以及如何做吗?
这是我的平台信息:
Win32 上的 Python 3.6.4(v3.6.4:d48eceb,2017 年 12 月 19 日,06:54:40)[MSC v.1900 64 位 (AMD64)]
最佳答案
它与 Python 的输出缓冲有关(对于您的情况下的子进程)。尝试禁用缓冲,您的代码应该可以工作。您可以通过使用 -u
键运行 python,或调用 sys.stdout.flush()
来完成此操作。
要使用-u
键,您需要修改Popen
调用中的参数,以使用flush()
调用您需要修改test2.py
。
此外,您的 test1.py
只会打印一个数字,因为您只从管道中读取 1 个字节,而不是在循环中读取它们。
解决方案1:
测试1.py
import subprocess as sbp
with sbp.Popen(["python3", "-u", "./test2.py"], stdout=sbp.PIPE) as proc:
print("parent process")
while proc.poll() is None: # Check the the child process is still running
data = proc.stdout.read(1) # Note: it reads as binary, not text
print(data)
print("end")
这样您就根本不必接触 test2.py
。
解决方案2:
测试1.py
import subprocess as sbp
with sbp.Popen("./test2.py", stdout=sbp.PIPE) as proc:
print("parent process")
while proc.poll() is None: # Check the the child process is still running
data = proc.stdout.read(1) # Note: it reads as binary, not text
print(data)
print("end")
测试2.py
import random
import time
import sys
def r():
while True:
yield random.randint(0, 100)
for i in r():
print(i)
sys.stdout.flush() # Here you force Python to instantly flush the buffer
time.sleep(1)
这将在新行上打印每个接收到的字节,例如:
parent process
b'9'
b'5'
b'\n'
b'2'
b'6'
b'\n'
您可以通过在参数中提供 encoding
或提供 universal_newlines=True
将管道切换到文本模式,这将使其使用默认编码。然后直接写入父进程的 sys.stdout 。这基本上会将子进程的输出流式传输到父进程的输出。
测试1.py
import subprocess as sbp
import sys
with sbp.Popen("./test2.py", stdout=sbp.PIPE, universal_newlines=True) as proc:
print("parent process")
while proc.poll() is None: # Check the the child process is still running
data = proc.stdout.read(1) # Note: it reads as binary, not text
sys.stdout.write(data)
print("end")
这将提供输出,就像直接执行 test2.py
一样:
parent process
33
94
27
关于python - 如何在 Windows 上非阻塞地从 python 子进程 popen 读取 stdout?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48259183/
需要帮助将这些给定的数字打印成星号,但我是编程新手;我该怎么做? #include int main(void) { int a[5]={20,1,5,15,12}; int i=0
使用 Delphi XE 2 我试图确定缩放方向以将缩放效果应用于图像(TImage),但没有找到执行此操作的函数,并且图像的 OnGesture 事件中的 EventInfo 属性没有此信息. 我见
我不知道制服在内存中是如何表示的。 制服似乎会占用宝贵的寄存器空间,但它们最终会传入/通过/传出到全局内存中,对吗? 制服不用时情况会发生变化吗?编译器可以将它们优化掉吗?--在这种情况下,我已经将无
我正在尝试在名为“timeclock”的模型上记录“time_in”和“time_out”记录。这是我想做但无法开始工作的事情! 检查最后一个时钟条目,看看它是否同时填充了“time_in”和“tim
我想听听您如何解决这种编程任务!?每种类型(OPER = 1 类型)对应一种特定的信息。 这只是大约 10 个具有相同结构的规范之一。首选创建这些“转换器”(协议(protocol))的通用方法。 最
我正在使用 Rest API(NodeJS、Express)和 PostgreSQL 制作 React-Native 应用。 在我的本地机器上托管时一切正常。当 API 托管在我的机器上并且 Post
我是一名优秀的程序员,十分优秀!