Python子进程在有用户输入时不实时显示最后一行文本

Python子进程在有用户输入时不实时显示最后一行文本,python,subprocess,spawn,Python,Subprocess,Spawn,我对该问题中提供的所有解决方案都有疑问: 对于这个问题,我需要做与OP相同的事情,但解决方案对我来说并不太有效。我需要得到标准输出并处理它(主要通过日志)。但是,一些被调用的程序会提示用户输入密码。我事先不知道该文本是什么,但会出现类似“输入密码”的提示: 当我运行这些解决方案时,我得到的是所有文本行,直到它请求输入的行。我想可能是因为结尾没有换行?当程序暂停时,如果我只是输入密码,我就会看到提示文本,进程就会继续。如果我只是点击回车键,我会看到(在一个例子中)输入你的密码:错误:无效密码。然后

我对该问题中提供的所有解决方案都有疑问:

对于这个问题,我需要做与OP相同的事情,但解决方案对我来说并不太有效。我需要得到标准输出并处理它(主要通过日志)。但是,一些被调用的程序会提示用户输入密码。我事先不知道该文本是什么,但会出现类似“输入密码”的提示:

当我运行这些解决方案时,我得到的是所有文本行,直到它请求输入的行。我想可能是因为结尾没有换行?当程序暂停时,如果我只是输入密码,我就会看到提示文本,进程就会继续。如果我只是点击回车键,我会看到(在一个例子中)输入你的密码:错误:无效密码。然后它会暂停。我知道它再次提示我输入密码并等待输入

希望这是有道理的。知道如何从缓冲区中获取最后一部分行并显示它吗?所有这些最终都会显示出来,但只有在我按enter键之后

我会发布一个更简单的例子,但我想不出任何简单的程序,人们可能会有工作。这里有一个我正在尝试使用的。它是sqlplus。运行时,它会提示输入用户名,然后输入密码。用户名提示仅在按enter键后显示,当然,这是一个错误。如果您输入用户名,它将继续,您可以输入密码(尽管在按enter键之前您不会看到提示)

这是另一篇文章中的一个解决方案,它在很大程度上是有效的,但只是缺少了最后一行。我从那篇文章中尝试了多次,但这是在这里复制它最简单、最短的方法

import subprocess

def execute(cmd):

    popen = subprocess.Popen(cmd, stdout=subprocess.PIPE, bufsize=1, universal_newlines=True)
    for stdout_line in iter(popen.stdout.readline, ""):
        popen.stdout.flush()
        yield stdout_line 
    popen.stdout.close()
    return_code = popen.wait()

# Example
for text in execute(["sqlplus"]):
    print(text, end="")    
其输出如下所示:

$ /home/lewis/python/scriptrepl/bin/python3 /home/lewis/python/scriptrepl/subpy2.py

SQL*Plus: Release 19.0.0.0.0 - Production on Sat Sep 5 17:14:31 2020
Version 19.8.0.0.0

Copyright (c) 1982, 2020, Oracle.  All rights reserved.
然后它停在那里。我知道这是在询问用户名。如果我按enter键,我会得到以下结果:

Enter user-name: ERROR:
ORA-12162: TNS:net service name is incorrectly specified
“输入用户名:”是它暂停的内容,应该显示出来,但在我按Enter键之前不会显示

我该如何处理这个问题


谢谢。

我现在找到了解决办法。这不是一个首选的解决方案,因为它是非pythonic和非常笨拙的。我正在使用LinuxTEE命令,然后读取一个文件。非常不理想,但它完成了任务。我使用的代码,我从这个链接,并为我自己的用途修改。如果有人有/找到了一个类似蟒蛇的答案,请分享。