Как изменить объекты в скрипте Python, используя прерывание клавиатуры для определенных клавиш?

Посмотрев на KeyboardInterrupt для выхода из многопоточного скрипта, мне стало интересно, можно ли использовать клавиши вверх и вниз на клавиатуре для увеличения / уменьшения количества используемых потоков? Надеемся, что это произойдет так же, как 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)

1 ответ

Решение

KeyboardInterrupt это особая вещь. В Unix Python позволяет терминалу превращать ^C в SIGINT сигнал, и он устанавливает обработчик сигнала для SIGINT это вызывает исключение. В Windows это немного сложнее, но основная идея та же. Обычные нажатия клавиш не будут прерывать ваш код.

Но вы можете просто посвятить нить прослушиванию клавиатуры. Ваш основной поток, кажется, не делает ничего полезного; если это так, переведите эту работу в фоновый поток. Тогда ваш основной поток может просто сидеть и ждать ввода с клавиатуры.

Но... как вы ждете ввода с клавиатуры? Это сложная часть. Обычно на большинстве платформ ввод буферизуется. А клавиши со стрелками уже имеют особое значение, например, циклически перемещаясь по истории прошлых записей.

Вы можете сделать это на низком уровне с помощью консольного ввода-вывода в Windows, termios на Unix), и изучая весь беспорядочный бизнес о кодах символов, чтобы вы могли фактически идентифицировать клавиши со стрелками. Но вам, вероятно, будет гораздо проще использовать высокоуровневую оболочку. Есть все виды выбора, начиная от таких вещей, как getch а также consoleio до PyGame или Qt; поиск вокруг PyPI.

Другие вопросы по тегам