停止python进程,以便上下文管理器仍然调用_exit__(在windows中)

停止python进程,以便上下文管理器仍然调用_exit__(在windows中),python,windows,Python,Windows,我如何停止python进程,使任何活动的上下文管理器在关闭之前都能优雅地调用其_退出__)函数 我使用上下文管理器(uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu。尽管我们现在开始执行运行数小时的例程,但它一直工作得很好。通常,在启动一个程序后不久,我们就会意识到我们有一个bug,我们宁愿在短时间内停止这个过程 我一直在运行PyCharm的代码,它允许您“停止”正在运行的进程。无

我如何停止python进程,使任何活动的上下文管理器在关闭之前都能优雅地调用其_退出__)函数

我使用上下文管理器(uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu。尽管我们现在开始执行运行数小时的例程,但它一直工作得很好。通常,在启动一个程序后不久,我们就会意识到我们有一个bug,我们宁愿在短时间内停止这个过程

我一直在运行PyCharm的代码,它允许您“停止”正在运行的进程。无论我是在调试中还是在运行中,这似乎会立即终止进程。退出函数似乎没有被调用

此外,控制硬件的计算机运行windows,如果这起作用的话***

***事实上,这起到了作用。Macosx似乎在调用退出函数,而windows则没有

我决定写一个基本测试:

from abc import *
import time

class Test(object):
    __metaclass__ = ABCMeta

    def __init__(self, *args, **kwargs):
        print("Init called.")

    def __enter__(self, *args, **kwargs):
        print("enter called")

    def __exit__(self, type, value, traceback):
        print("Exit called")

with Test() as t:
    time.sleep(100)
print("Should never get here.")
我从PyCharm运行这段代码,当它在sleep语句中时,我按下PyCharm中的stop按钮。以下是这两种方法的输出:

Macosx:

Init called.
enter called
Exit called
Traceback (most recent call last):
  File "/Applications/PyCharm CE.app/Contents/helpers/pydev/pydevd.py", line 1591, in <module>
    globals = debugger.run(setup['file'], None, None, is_module)
  File "/Applications/PyCharm CE.app/Contents/helpers/pydev/pydevd.py", line 1018, in run
    pydev_imports.execfile(file, globals, locals)  # execute the script
  File "/Users/.../Library/Preferences/PyCharmCE2017.1/scratches/scratch_25.py", line 22, in <module>
    time.sleep(100)
KeyboardInterrupt

我在PyCharm bug追踪器上找到了一个解决方法:

  • 在PyCharm中,转到帮助->编辑自定义属性
  • 同意创建idea.properties文件(如果需要)
  • 添加以下行:kill.windows.processs.software=true
  • 如果使用Numpy或Scipy,还需要添加以下环境变量:

    os.environ['FOR_DISABLE_CONSOLE_CTRL_HANDLER']=“1”

  • 重新启动Pycharm

现在,当我使用这个应用程序(在Windows上!)运行测试时,我得到以下输出:

Init called.
enter called
Exit called
Traceback (most recent call last):
  File "C:/Users/.../.PyCharmCE2017.1/config/scratches/scratch_3.py", line 20, in <module>
    time.sleep(100)
KeyboardInterrupt

Process finished with exit code 1
Init被调用。
输入呼叫
出口呼叫
回溯(最近一次呼叫最后一次):
文件“C:/Users/...PyCharmCE2017.1/config/scratch/scratch_3.py”,第20行,在
时间。睡眠(100)
键盘中断
进程已完成,退出代码为1

Control-C可以工作,如果它是从命令提示符下运行的。我们目前从PyCharm运行,虽然我认为它可以让你打开某种终端。什么操作系统和Python版本?将
\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu?我不是PyCharm所用的,但处理
键盘中断
听起来是个不错的做法。我可能完全错了。我刚刚做了一个基本的上下文管理器,里面有一个time.sleep(100)。当我点击PyCharm中的停止按钮时,它调用退出功能。
Init called.
enter called
Exit called
Traceback (most recent call last):
  File "C:/Users/.../.PyCharmCE2017.1/config/scratches/scratch_3.py", line 20, in <module>
    time.sleep(100)
KeyboardInterrupt

Process finished with exit code 1