自己尝试了一段时间后,我找不到任何解决方案,并且互联网资源似乎没有帮助。
我试图使用 CTRL+C 按键在 Linux 中停止由命令行调用的 python3 脚本,遗憾的是它似乎不起作用。
在我调用 libpcap 函数后,程序应该停止:
myInt = libpcap.next_ex(pcap_t_my, ctypes.byref(pcap_pkthdr), ctypes.byref(pcap_pkt_data))
该函数接收一个结构,其中包含一个名为 time out 的参数/变量。我将其设置为 24000 毫秒,以便试验 libpcap 函数。
看来,当程序运行 libpcap.next_ex 函数时,使用 python3 的信号库来中断该函数以停止程序是不可能的。尽管如此,它还是会读取信号并在超过超时值后执行对处理程序的调用。
我的一些代码:
#Signal Handler fro CTRL+C
def shutDown_Handler(signal,frame):
print("Program aborting by system handles KeyboardInterrupt...")
SetDownProgram()
print("Program aborted by system handles KeyboardInterrupt")
sys.exit(0)
if __name__== "__main__":
...
signal.signal(signal.SIGINT, shutDown_Handler)
try:
...
except KeyboardInterrupt:
print("Program aborting...")
SetDownProgram()
print("Program aborted")
else:
print("Program finished as planned")
问题是.. 如何在运行 python3 脚本的控制台中按 CTRL+C 后程序立即结束?
只需提及我正在使用 python 环境运行 python3 脚本。 作为: /home/$USER/Documents/myPyEnv/bin/python3
它会影响你调用SIGINT中断的方式吗?只需提及程序会读取它,但在设置的超时时间结束之前不会影响其行为。
好吧...我用Python中的线程解决了这个问题。 对于任何阅读我如下问题并且似乎有效的人:
import threading
threading.Thread(target=NormalFunction, daemon=False).start()
或者:
NormalFunctionThread = threading.Thread(target=NormalFunction, daemon=False)
NormalFunctionThread.start()
#Signal Handler fro CTRL+C
def shutDown_Handler(signal,frame):
print("Program aborting by system handles KeyboardInterrupt...")
SetDownProgram()
print("Program aborted by system handles KeyboardInterrupt")
#sys.exit("Program aborted.")
#os._exit in order to do not show traceback
os._exit(0)
现在它按预期工作了! :D
如有任何改进或注释,我们将不胜感激。