gpt4 book ai didi

python - 在 python 中等待输入时打印到控制台

转载 作者:行者123 更新时间:2023-12-04 15:27:50 25 4
gpt4 key购买 nike

我有一个 python 脚本(用作命令行界面),它使用 input 函数等待输入查询。

while True:
query = input('Enter query: ')
thread = Thread(target=exec_query, args=(query,))
thread.start()

同时,一个工作线程正在执行这样的查询。使用 print 函数将查询的输出打印到命令行。

def exec_query(query_data):
# doing a complex data processing ...
print('results of the query')

因此,print函数的输出写在前缀'Enter query:'后面,由主线程中第二次执行print函数打印:

Enter query: {the query}
Enter query: results of the query

我想实现打印函数的输出插入前缀 'Enter query: ' 之前(或者看起来是这样):

Enter query: {the query}
results of the query
Enter query:

我已经通过了一些方法,但没有找到好的解决方案。一workaround将通过添加 '\x1b[1A\x1b[2K' 来删除前缀,并在打印查询执行的输出后将其写回。这里的问题是,我不知道如何重建用户此时可能已经插入的不完整用户输入(查询)。

最佳答案

使用这个Read 1 char from terminal

  • 返回字节
    • 通过bytes.decode()获取str
  • 不回显(打字不可见)
    • _GetchWindows.__call__ 中使用 .getche 而不是 msvcrt.getch
  • msvcrt 不是全局导入的

做类似的事情

while input != '\r': # or some other return char, depends
input += getch().decode()

# in front of erase
while msvcrt.kbhit(): # read while there is something to read
remember_input += getch().decode()
print(erase)
# and than you should return remember_input to stdin somehow (try msvcrt.putch)

因为复杂性(用线程编写(我是新手)、输入/输出控制(因为我的 vsc 终端每次都讨厌我),我自己没有做过),可能还有更多原因累得想不起来)
但我相信你不会放弃

编辑:哦,是的
我忘了说你可能还想写你自己的 printinput,
在这种情况下有用的东西是 input(prompt, remember_string)
提示将无法通过退格键删除,并且 remember_string 将

重大更新
我使用了 curses 模块而不是 msvcrt(如最初建议的那样)

这实际上与您的问题类似(大大简化了模拟),
但解决了问题的核心

  1. 接收输入
  2. 发生事情时删除行并在该行中写入消息
  3. 在那里重新输入已经写好的东西

这需要输入,只要它是 <= 3 个字符。
如果写入 >= 4 个字符,它将执行 (3.) 对您来说完成查询的操作,
然后使用旧输入再次请求输入。
当按下 ENTER 时,完成输入

import curses
import curses.ascii as ascii

def getch(stdscr: curses.window):
'return single char'
a = stdscr.get_wch()
stdscr.refresh()
return a

def prompt(stdscr: curses.window):
'write prompt for input'
addstr(stdscr, "Enter query: ")

def addstr(stdscr: curses.window, str):
'write string to window'
stdscr.addstr(str)
stdscr.refresh()

def del_line(stdscr: curses.window):
'deletes line in which cursor is'
row, col = stdscr.getyx()
stdscr.move(row, 0)
stdscr.clrtoeol()

@curses.wrapper
def main(stdscr: curses.window):
# next 3 lines were on some tutorial so I left them be
# Clear screen
stdscr.clear()
curses.echo()

# I will use marks like #x.y to indicate places
q = ''
while True: #EDIT from `for (5)` to `while`
prompt(stdscr)
addstr(stdscr, q) # at the beginning & after enter is pressed, q==''
# else it is old input (that was >= 4 chars
for i in range(4): # range 4 to take 4 or less chars
a = getch(stdscr) #read charby char
if ascii.isalnum(a): #letters & numbers
q += a
elif a == '\n' or a == '\r': # enter pressed == input finished
stdscr.addstr(f"\nfinished input {q}\n")
q = ''
break
else: # this block happens (in py) if no break occurred in loop
# that means, in this case, that ENTER was not pressed, i.e. input is stillongoing
# but since it is > 4 chars it is briefly interrupted to write message
del_line(stdscr)
addstr(stdscr, "Input interupted\n")

return

测试
运行这个程序(我建议简单地双击文件打开标准终端,因为其他终端可能有一些反对这个[程序])
(E代表ENTER)
并输入:abcEabcdefEabcdefghijE
看看这是做什么的

附言

这可能会解决您的问题,但此模块的功能更大,
而且我不想写太多复杂的 API。
解决方案是编写 API 来轻松管理更多的事情,比如用箭头移动,但这不在这个问题的范围内

关于python - 在 python 中等待输入时打印到控制台,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61912900/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com