如何通过对特定键使用键盘中断来更改 python 脚本中的对象?

How to change objects in a python script by using a keyboardinterrupt for specific keys?

在查看用于退出多线程脚本的 KeyboardInterrupt 之后,我想知道是否可以使用键盘上的向上和向下键来 increase/decrease 正在使用的线程数?这有望以与 KeyboardInterrupt 相同的方式发生,以便它可以随时发生。这样的事情是否可能,或者是否有另一种方法更适合这种情况?

def do_something(input_file, threads):
concurrent = threads
l = read_csv(input_file)

for i in range(concurrent):
    t = Thread(target=create_accounts)
    t.daemon = True
    t.start()
try:
    for account in l:
        q.put(account)
    q.join()
except KeyboardInterrupt:
    sys.exit(1)

if __name__ == '__main__':

    threads = 1
    q = Queue(threads * 2)
    do_something('test.csv', threads)

一个KeyboardInterrupt是个特别的东西。在 Unix 上,Python 基本上让终端将 ^C 转换为 SIGINT 信号,并为引发异常的 SIGINT 安装信号处理程序。在 Windows 上,它有点复杂,但基本思想相同。普通按键不会中断您的代码。

但是你可以只用一个线程来听键盘。您的主线程似乎没有做任何有用的事情;如果是,则将该工作踢到后台线程。然后你的主线程就可以等待键盘输入了。

但是……你如何等待键盘输入?这是棘手的部分。通常,在大多数平台上,输入是行缓冲的。而且箭头键已经有了特殊的含义,就像循环浏览过去条目的历史。

您可以通过在 Unix 上使用 Console I/O on Windows, termios 来在低级别执行此操作),并学习有关字符代码的整个混乱业务,以便您可以真正识别箭头键。但是您可能会发现使用更高级别的包装器要容易得多。有各种各样的选择,从 getchconsoleio 到 PyGame 或 Qt;搜索 PyPI。