用户输入

问题描述

我对这个问题提供的所有解决方案都有疑问: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 (将#修改为@)