2017-07-10 7 views
4

一般に、Pythonインタプリタはどのように終了しますか?例えばコードの実行終了後、Pythonインタプリタはどのように終了しますか?

print('aaa') 

さておき他に何インタプリタが(上げ例外なく)通常の終了時とos._exitを呼び出さずにそのリソースを解放するために行うんatexitに登録終了ハンドラを呼び出すことから、このコードを実行した後、 ?

Pythonインタプリタがすべての終了時に呼び出すメインフック/関数はありますか?

print('aaa') 
_exit() # called automatically on every exit 
+0

実際に答えはわかりませんが、使用しているオペレーティングシステムに基づいて変更されていると思います – yuvi

+4

ロードされたモジュールをリリースしてステータスコードを返すためにC APIを呼び出します。あなたの意図は何ですか? – paiv

+0

私は答えを提供しましたが、@ yuviが述べたように、正確に何が欲しいかを知ることは難しいです。 – xaav

答えて

3

os._exit()が呼び出されていない、全てのPythonの初期化は、次に、所定のPythonコードを実行し、Py_Initializeでインタプリタを起動し、オペレーティングシステムにステータスコードを渡すと仮定します。それは本当にこのです:インタプリタがきれいに抜けるように

n = PyImport_ImportFrozenModule("__main__"); 
    if (n == 0) 
     Py_FatalError("__main__ not frozen"); 
    if (n < 0) { 
     PyErr_Print(); 
     sts = 1; 
    } 
    else 
     sts = 0; 

    if (inspect && isatty((int)fileno(stdin))) 
     sts = PyRun_AnyFile(stdin, "<stdin>") != 0; 

#ifdef MS_WINDOWS 
    PyWinFreeze_ExeTerm(); 
#endif 
    if (Py_FinalizeEx() < 0) { 
     sts = 120; 
    } 

error: 
    PyMem_RawFree(argv_copy); 
    if (argv_copy2) { 
     for (i = 0; i < argc; i++) 
      PyMem_RawFree(argv_copy2[i]); 
     PyMem_RawFree(argv_copy2); 
    } 
    PyMem_RawFree(oldloc); 
    return sts; 

さえsys.exitは、単純に例外が発生します。

Pythonインタプリタが 上のすべての出口を呼び出すメインフック/機能はありますか?

あなたのmain()をtry..finallyでラップするだけです。

+0

あなたは凍ったスクリプト専用のコードを見ているようです。 – user2357112

+0

Py_Mainが複雑すぎて、スタックオーバーフローの回答に投稿できません。このコードは十分に似ていますが、理解するのは簡単です。 – xaav

関連する問題