当前位置: 首页 > 知识库问答 >
问题:

在Python中捕获PyCharm停止信号

霍修筠
2023-03-14

我想在try块中捕获PyCharm的stop信号(当stop被按下时),但是我不知道这个信号是什么或者如何在代码中捕获它。JetBrains在他们的文档中没有提供这方面的见解。

我尝试将其捕获为BaseException,但它似乎根本不是异常。

这在编程上是完全可以捕获的吗?

共有2个答案

丁经略
2023-03-14

我无法复制其他答案,因为停止按钮作为键盘中断发送。我相信停止按钮在不同版本的PyCharm和操作系统上有可能以不同的方式实现(我在Linux,不同的答案似乎是Windows,但我在很多方面都不确定)

在我看来,似乎正在发送一个kill信号,并且它似乎不像捕捉那样作为一个异常工作(对我来说)。然而,通过参考这篇关于在Python中捕捉kill信号并优雅地杀死它的文章,我多少捕捉到了一个kill信号。下面是我用的代码。当我按下stop按钮时,我看到< code>Hello world,但没有看到< code>foobar。

此外,通过这样做,handler_stop_signals中的断点无法捕获调试器,但我确实看到了文本。所以我不确定这是否真的能回答你的问题,基于你的需求。还要注意的是,我从未真正编写过这样的代码(使用全局变量),但这是我能想到的最简单的答案。

import signal
import time

run = True

def handler_stop_signals(signum, frame):
    global run
    print("Hello world")
    run = False

signal.signal(signal.SIGINT, handler_stop_signals)
signal.signal(signal.SIGTERM, handler_stop_signals)

while run:
    try:
        time.sleep(20) # do stuff including other IO stuff
    except: BaseException as e:
        print('foobar')
万高轩
2023-03-14

当您按下stop按钮并记录或检查回溯时,您可以捕获异常。然而,当您运行调试器< code>pydev.py时,发生的情况是您正在启动一个客户端/服务器进程,该进程将作为客户端执行您的程序。启动调试器时,请注意控制台:

C:\path_to_your_python_binary\python.exe "C:\Program Files\JetBrains\PyCharm 2019.3.2\plugins\python\helpers\pydev\pydevd.py" --multiproc --qt-support=auto --client 127.0.0.1 --port 51438 --file C:/path_to/your_module.py C:\path_to_working_directory
Connected to pydev debugger (build 212.5080.64)

通过按stop,您实际上终止了< code>pydev.py服务器进程,因此调试器不会像往常一样冻结在您的modules except子句上。您可以通过按下以下代码片段的print语句中的stop按钮并打印或记录traceback来验证它(示例代码改编自该答案)。

try:
    print("Press stop button here.")
except BaseException as err:
    raise Exception('Smelly socks').with_traceback(err.__traceback__)

请参阅屏幕截图:

堆栈跟踪将给出:

Traceback (most recent call last):
  File "C:/path_to/your_module.py", line 2, in <module>
    print("Press stop button here.")
  File "C:/path_to/your_module.py", line 2, in <module>
    print("Press stop button here.")
  File "_pydevd_bundle\pydevd_cython_win32_39_64.pyx", line 1589, in _pydevd_bundle.pydevd_cython_win32_39_64.ThreadTracer.__call__
  File "_pydevd_bundle\pydevd_cython_win32_39_64.pyx", line 929, in _pydevd_bundle.pydevd_cython_win32_39_64.PyDBFrame.trace_dispatch
  File "_pydevd_bundle\pydevd_cython_win32_39_64.pyx", line 920, in _pydevd_bundle.pydevd_cython_win32_39_64.PyDBFrame.trace_dispatch
  File "_pydevd_bundle\pydevd_cython_win32_39_64.pyx", line 317, in _pydevd_bundle.pydevd_cython_win32_39_64.PyDBFrame.do_wait_suspend
  File "C:\Program Files\JetBrains\PyCharm 2019.3.2\plugins\python\helpers\pydev\pydevd.py", line 1147, in do_wait_suspend
    self._do_wait_suspend(thread, frame, event, arg, suspend_type, from_this_thread)
  File "C:\Program Files\JetBrains\PyCharm 2019.3.2\plugins\python\helpers\pydev\pydevd.py", line 1162, in _do_wait_suspend
    time.sleep(0.01)
KeyboardInterrupt

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "C:\Program Files\JetBrains\PyCharm 2019.3.2\plugins\python\helpers\pydev\pydevd.py", line 2173, in <module>
    main()
  File "C:\Program Files\JetBrains\PyCharm 2019.3.2\plugins\python\helpers\pydev\pydevd.py", line 2164, in main
    globals = debugger.run(setup['file'], None, None, is_module)
  File "C:\Program Files\JetBrains\PyCharm 2019.3.2\plugins\python\helpers\pydev\pydevd.py", line 1476, in run
    return self._exec(is_module, entry_point_fn, module_name, file, globals, locals)
  File "C:\Program Files\JetBrains\PyCharm 2019.3.2\plugins\python\helpers\pydev\pydevd.py", line 1483, in _exec
    pydev_imports.execfile(file, globals, locals)  # execute the script
  File "C:\Program Files\JetBrains\PyCharm 2019.3.2\plugins\python\helpers\pydev\_pydev_imps\_pydev_execfile.py", line 18, in execfile
    exec(compile(contents+"\n", file, 'exec'), glob, loc)
  File "C:/path_to/your_module.py", line 4, in <module>
    raise Exception('Smelly socks').with_traceback(err.__traceback__)
  File "C:/path_to/your_module.py ", line 2, in <module>
    print("Press stop button here.")
  File "C:/path_to/your_module.py ", line 2, in <module>
    print("Press stop button here.")
  File "_pydevd_bundle\pydevd_cython_win32_39_64.pyx", line 1589, in _pydevd_bundle.pydevd_cython_win32_39_64.ThreadTracer.__call__
  File "_pydevd_bundle\pydevd_cython_win32_39_64.pyx", line 929, in _pydevd_bundle.pydevd_cython_win32_39_64.PyDBFrame.trace_dispatch
  File "_pydevd_bundle\pydevd_cython_win32_39_64.pyx", line 920, in _pydevd_bundle.pydevd_cython_win32_39_64.PyDBFrame.trace_dispatch
  File "_pydevd_bundle\pydevd_cython_win32_39_64.pyx", line 317, in _pydevd_bundle.pydevd_cython_win32_39_64.PyDBFrame.do_wait_suspend
  File "C:\Program Files\JetBrains\PyCharm 2019.3.2\plugins\python\helpers\pydev\pydevd.py", line 1147, in do_wait_suspend
    self._do_wait_suspend(thread, frame, event, arg, suspend_type, from_this_thread)
  File "C:\Program Files\JetBrains\PyCharm 2019.3.2\plugins\python\helpers\pydev\pydevd.py", line 1162, in _do_wait_suspend
    time.sleep(0.01)
Exception: Smelly socks

Process finished with exit code 1

堆栈跟踪显示的是当您按下停止按钮时抛出的异常是一个KeyboardInterrup,但您也可以使用异常层次结构中更高的异常(例如BaseException)编写catch子句,结果是一样的。

 类似资料:
  • 如果程序员返回的是Arraylist而不是List,我会尝试生成一个警告。我使用Spring Boot,Spring Data JPA。 Pojo示例 我的存储库:

  • 问题内容: 在Linux下的python 2.6中,我可以使用以下命令来处理TERM信号: 除了仅一次设置一个信号,是否可以为该过程接收的所有信号设置处理程序? 问题答案: 您可以循环浏览信号模块中的信号并进行设置。

  • 我有一个2个简单的项目,带有简单的python脚本。没有其他用户,没有java,没有数据库,没有部署,一点也不复杂。我已经排除了两个项目文件夹。我已经下载了共享索引,尽管我现在看到我不需要共享索引,因为我是一个孤独的程序员。我从网上搜索答案中看到,这个问题自2016年以来一直是一个问题!我安装了最新的PyCharm v2021.3.2。希望这个错误得到修复。似乎没有什么工作。我已经让它为HOURS

  • 问题内容: QPushButton有一个名为的信号,我们可以通过它捕获点击事件。是否有捕获悬停和离开事件的方法或信号? 如何捕获鼠标悬停按钮和鼠标离开按钮,如下所示: 注意:我使用python3。 问题答案: 您需要继承该类,并重新实现and : 然后,您可以在本地处理事件或发出信号(如果其他小部件需要对此事件做出反应,则可以使用信号将事件通知其他小部件)。

  • 问题内容: 我有一个使用套接字,数据库连接之类的过程。从根本上讲,这是一个服务器过程,在传感器数据和Web界面之间进行中继,因此确保应用程序(如果被终止)正常终止很重要。 如何处理诸如segfaults(至少用于调试)之类的意外异常以及kill信号,以便我可以关闭任何连接并停止任何线程的运行,从而使进程不会留下任何正在使用的东西? 问题答案: 您可以安装信号处理程序来捕获信号-但是在99%的情况下

  • 问题内容: 我想在Go中实现“流程包装器”。基本上它将执行的是启动一个进程(比如说一个节点服务器)并监视它(捕获诸如SIGKILL,SIGTERM之类的信号…) 我认为要做的方法是使用以下命令在go例程中启动节点服务器: 然后,我想捕获由执行的命令生成的所有可能的信号。我是Go的新手,我们将不胜感激。 问题答案: Go中有三种执行程序的方式: 包含syscall.Exec,syscall.Fork