如果没有脚本在运行,是否可以在外壳中处理KeyboardInterrupt?
我的问题的背景如下: 我使用python通过套接字连接将命令发送到电机控制器。该功能将电动机的目标位置发送到控制器,并立即返回,即在电动机实际到达其目标位置之前返回。现在可能会发生这样的情况,用户进入错误的位置并希望尽快中断电动机的运动。这可以通过键入stop()来完成,该命令向控制器发送一个stop命令。但是,如果可以通过按Ctrl + C来停止电动机,则将更加直观和快捷。 有没有办法让python在没有脚本运行的情况下按Ctrl + C来执行功能?
我知道如何处理正在运行的脚本中的KeyboardInterrupt异常或signal.SIGINT,但找不到有关如何解决目标的任何提示。
我将非常感谢您的帮助!
答案 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()
。