如果没有脚本在运行,请在外壳中处理KeyboardInterrupt

时间:2018-11-30 11:10:43

标签: python keyboardinterrupt

如果没有脚本在运行,是否可以在外壳中处理KeyboardInterrupt?

我的问题的背景如下: 我使用python通过套接字连接将命令发送到电机控制器。该功能将电动机的目标位置发送到控制器,并立即返回,即在电动机实际到达其目标位置之前返回。现在可能会发生这样的情况,用户进入错误的位置并希望尽快中断电动机的运动。这可以通过键入stop()来完成,该命令向控制器发送一个stop命令。但是,如果可以通过按Ctrl + C来停止电动机,则将更加直观和快捷。 有没有办法让python在没有脚本运行的情况下按Ctrl + C来执行功能?

我知道如何处理正在运行的脚本中的KeyboardInterrupt异常或signal.SIGINT,但找不到有关如何解决目标的任何提示。

我将非常感谢您的帮助!

2 个答案:

答案 0 :(得分:1)

如果控制器可以处理与套接字的多个连接,则可以启动一个全新的进程,该进程利用keyboard模块侦听ctrl+c,然后使该进程发送stop命令到控制器。

首先从pypi安装键盘包

pip install keyboard

创建一个文件来监听ctrl+c

# file named 'wait_stop.py
##########################

import keyboard

# code here to establish connection to controller

def wait_stop():
    keyboard.wait('ctrl+c')
    print('sending stop signal')
    # function that sends stop signal here...
    # ...
    # call wait_stop again to continue listening.
    wait_stop()

if __name__ == '__main__':
    wait_stop()

现在,您可以通过以下方式在单独的shell中启动该过程:

python wait_stop.py

只要wait_stop处理外壳不是活动窗口,则按ctrl+c将导致向控制器发送stop()函数。如果该窗口处于活动状态,它也会终止wait_stop.py进程。

答案 1 :(得分:0)

KeyboardInterrupt发送SIGINT信号(代码2)。

因此,您无需按CTRL + C即可发送带有kill -2 <pid>的KeyboardInterrupt。

要显示您的程序pid,请使用os.getpid()