子流程stdout的逐行处理中的非终止循环

时间:2019-03-28 19:13:21

标签: python subprocess

  

在Python 3.7中,需要对以下代码进行哪些具体更改,以便在subprocess完成运行后成功终止循环?

以下代码确实运行子进程并打印每一行。但是问题是while true循环永远不会终止,因为控制台会一直在每个新行上永远打印b'',直到我重新启动机器为止。

import subprocess  
proc = subprocess.Popen('python name-of-script.py',cwd="C:\\path\\to\\directory",stdout=subprocess.PIPE)  
while True:  
  line = proc.stdout.readline()
  if line != '':  
    #the real code does filtering here  
    print(line)
  else:
    break

有意义的输出之后,终端将继续打印以下内容:

b''
b''
b''
b''
b''
b''
b''
b''
b''
b''
b''
b''  

2 个答案:

答案 0 :(得分:1)

创建Popen对象时,您得到的字节流为stdout

这在documentation

中有解释
  

如果指定了encodingerrors参数,或者universal_newlines参数是True,则该流是文本流,否则是字节流。

因此,当您将line与空的字符串进行比较时,它总是不相等的,因为line最多可以是空的byte对象{{1 }}。

空字节对象是虚假的值,因此将b''替换为if line != ''对空字符串和空字节对象均有效。

如果以后您希望if line:成为文本流,则代码不会中断:)

stdout

答案 1 :(得分:0)

那是因为您正在比较苹果和梨。

''b''

不同
相关问题