【问题标题】:KeyboardInteruption but for all keys [duplicate]KeyboardInteruption,但适用于所有键[重复]
【发布时间】:2017-04-27 19:18:23
【问题描述】:

我已经在网上搜索了大约一个小时来搜索诸如 Keyboardinterupt 之类的命令,然后搜索所有键。我需要这个尝试和除外循环,我希望人们使用任何键退出。还有其他类似 KeyboardInterupt 的东西还是我需要成为黑客?

感谢您的宝贵时间

【问题讨论】:

    标签: python python-3.x try-except


    【解决方案1】:

    KeyboardInterrupt 是 Python 捕获 SIGINT 系统信号时引发的异常。你可以自己随意提升:raise KeyboardInterrupt。但是,您不能自己生成 SIGINT 信号,必须将信号发送到进程。按下 CTRL-C 可以达到类似的效果,它会向正在运行的进程发出 SIGINT 信号。

    如果你有一个循环并且想在某个键上打破它,你必须监听任何键盘事件并在它被捕获时引发异常;您需要一种机制来同时执行代码和监听事件。

    我可以想象这样的事情:

    • 您使用您的代码启动 Python 子进程
    • 你进入一个循环,捕捉到任何键盘按键
    • 当您收到按键事件时,您会将 SIGINT 信号发送到其他进程

    例如,Python 2.7(未测试):

    import multiprocessing
    import time
    import signal
    import select
    import sys
    import os
    
    def my_code():
      while True:
        print 'Do something...'
        time.sleep(1)
    
    if __name__ == '__main__':
        p = multiprocessing.Process(target=my_code)
        p.start()
    
        # wait for a key
        select.select([sys.stdin],[],[])
    
        os.kill(p.pid, signal.SIGINT)
    

    由于 stdin 缓冲,至少在 Linux 上,上面的代码在按键后需要 [Enter]。 但是,可以使用一些 Python 模块(例如 getc)轻松解决此问题。

    【讨论】:

    • 要绕过“按 Ctrl+C 中断”消息需要做很多额外的工作。不过答案很好,因为我误读了这个问题。
    • 非常感谢。然后我将使用线程模块。祝你有美好的一天
    • @Stijn 根据评论 here 线程不会做你想做的事。
    • @TemporalWolf 这一切都在使用循环或线程,单个循环不会让我在等待输入时继续做其他事情。不过还是谢谢。
    猜你喜欢
    • 2021-07-22
    • 1970-01-01
    • 1970-01-01
    • 2018-11-19
    • 2021-09-25
    • 1970-01-01
    • 1970-01-01
    • 2013-05-27
    • 2017-09-08
    相关资源
    最近更新 更多