2017-07-19 4 views
0

閉じる前に、アクティブなコンテキストマネージャが適切に__exit__関数を呼び出すように、Pythonプロセスを停止するにはどうすればよいですか?コンテキストマネージャがまだ__exit__(ウィンドウ内)を呼び出すように、Pythonプロセスを停止する

私はコンテキストマネージャ(__enter __()と__exit __())を使用して、光ハードウェアへの接続を確実かつ安全に閉じます。これはすごくうまくいっていますが、私たちは今何時間も実行するルーチンを実行し始めています。多くの場合、バグが発生した直後に気づき、むしろプロセスを短くすることにします。

実行中のプロセスを「停止」できるPyCharmからコードを実行しています。これは、私がデバッグ中であれ、実行中であれ、プロセスを即座に終了させるようです。 __exit__関数は呼び出されていないようです。

また、ハードウェアを制御するコンピュータが何らかの形で再生を開始すると、ウィンドウが実行されます。 ***

***実際に遊ぶようになります。 Macosxはウィンドウが表示されていない間はexit関数を呼び出すようです。私はPyCharmからこのコードを実行すると、それは睡眠文でありながら、私はpycharmで停止ボタンを押して

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.") 

は、私は基本的なテストを書くことにしました。

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 

のWindows

Init called. 
enter called 

Process finished with exit code 1 
+0

それは、コマンドプロンプトから実行していた場合はControl-Cは、働くだろう。 – jasonharper

+0

私は現在、PyCharmから実行していますが、何らかの端末を起動できると思っています。 – Batman0730

+0

オペレーティングシステムとPythonのバージョンは何ですか? – phd

答えて

0

私はPyCharmのバグトラッカーの回避策が見つかりました:で

https://youtrack.jetbrains.com/issue/PY-17252

  • をここでは、両方の出力がありますPyCharmはhに行くELP->編集カスタムプロパティ
  • は、(それが要求した場合)idea.propertiesファイルを作成することに同意
  • 次の行を追加します。あなたがnumpyのscipyのダウンロードまたはを使用している場合kill.windows.processes.softly =真
  • を、あなたも次の環境変数を追加する必要があります。

    は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 
関連する問題