繁体   English   中英

Python:readline/input() 与来自不同线程的输出交互

[英]Python: readline/input() interacting with output from different threads

我正在编写一个带有交互式控制台的多线程程序:

def console()
    import readline
    while True:
        data = input()
        do_whatever(data.split())

但是,我正在使用的库从不同的线程运行我的回调。 回调需要打印到控制台。 因此我想清除命令行,重新显示提示,并重新显示命令行。

如果没有重新实现readline ,我该怎么做?

这个解决 C 问题的答案开始,我得到了以下 Python 代码,它对我的​​目的来说效果很好:

import os
import readline
import signal
import sys
import time
import threading


print_lock = threading.Lock()

def print_safely(text):
    with print_lock:
        sys.stdout.write(f'\r\x1b[K{text}\n')
        os.kill(os.getpid(), signal.SIGWINCH)

def background_thread():
    while True:
        time.sleep(0.5)
        print_safely('x')

threading.Thread(target=background_thread, daemon=True).start()

while True:
    try:
        inp = input(f'> ')
        with print_lock:
            print(repr(inp))
    except (KeyboardInterrupt, EOFError):
        print('')
        break

print_safely

  • 使用\\r\\x1b[K ( CR + CSI 代码EL ) 删除现有的 Readline 提示
  • 打印其有效载荷行
  • SIGWINCH发送到运行 readline 的线程(在我的情况下,readline 在主线程中运行,因此 os.getpid() 给出了正确的目标 PID); 这会导致 readline 重新绘制其完整提示。

可能存在的问题:

  • 如另一个答案中所述,如果 readline 提示长于一行,则行清除很可能会失败。
  • 每当在主线程中打印时,您都需要获取 print_lock (这与 readline 问题无关)
  • 当用户在后台线程打印的同一时刻按下某个键时,可能会出现一些不正常的行为。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM