问题描述
我对这个问题提供的所有解决方案都有疑问:Constantly print Subprocess output while process is running
对于这个问题,我需要做与OP相同的事情,但是解决方案对我来说不是很有效。我需要获取STDOUT并对其进行处理(主要是通过日志)。但是,某些被调用的程序将提示用户输入密码。我不知道是什么文字还是确切的文字,但是会出现类似“输入密码:”的提示。
运行这些解决方案时得到的是所有文本行,直到它要求输入的行。我认为可能是因为末尾没有换行符吗?程序暂停时,如果我只输入密码,那么我会看到提示文本,然后继续进行操作。如果我只是按Enter键,我会(无论如何还是会看到)“输入您的密码:错误:密码无效”。然后停下来我知道它再次提示我输入密码并等待输入。
希望这是有道理的。知道如何从缓冲区中获取最后的部分行并将其显示吗?所有这些最终都将显示出来,但是只有在按Enter键之后才能显示。
我会发布一个更简单的示例,但是我想不出人们可能会使用的任何简单程序。这是我实际上要使用的一个。它是sqlplus。运行时,提示输入用户名,然后输入密码。用户名的提示仅在按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键之后才显示。
关于我应该如何处理这个问题的任何想法?
谢谢。
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)