为何stdout的readline()不等待换行?print逐字符打印问题排查
问题解答
核心问题根源
两个问题的本质是同一个代码逻辑错误:read_stdout函数的循环写法完全搞错了。
1. 为何stdout的PIPE readline()不等待换行符?
stdout.readline()本身是会等待换行符的,但你写的for line in stdout.readline()是先执行一次readline()读取整行,然后把这行字符串拆成单个字符逐个遍历——相当于只读取了一行,然后把这行拆成字符处理,根本没在循环读取后续行,所以看起来像是没等换行就输出了。
2. 为何read_stdout函数中的print(line)会逐字符打印而非整行?
因为上述循环是在遍历单个字符串的每个字符,每次循环的line其实是一个字符,而非整行内容,自然会逐字符打印,每个字符也被单独放进了队列。
修复代码
把read_stdout改成正确的逐行读取逻辑,两种写法任选:
写法一(直接遍历stdout流):
def read_stdout(stdout, data_q): for line in stdout: print(line, end='') # line自带换行符,避免重复输出空行 data_q.put(line) stdout.close()
写法二(显式调用readline()循环):
def read_stdout(stdout, data_q): while True: line = stdout.readline() if not line: # 流关闭时readline()返回空字符串 break print(line, end='') data_q.put(line) stdout.close()
修复后效果
运行plugin_test.py会得到正常的整行输出:
this is a test this is a test2 100% Plugin "" started.
队列中存储的也会是完整的行内容,符合你最初的预期。
内容的提问来源于stack exchange,提问作者user740521
相关产品推荐
相关产品推荐

