完成执行代码后,Python解释器如何退出?

时间:2017-07-10 19:22:07

标签: python

一般来说,Python解释器是如何退出的?

例如:

print('aaa')

执行此代码后,除了调用注册了atexit的退出处理程序外,解释器在正常退出时(没有引发异常)并且不调用os._exit时还会做什么来释放资源?

Python解释器是否在每个出口调用一个主钩子/函数?

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

1 个答案:

答案 0 :(得分:3)

假设未调用os._exit(),所有python初始化都以Py_Initialize启动解释器,然后执行给定的Python代码,然后将状态代码传递给操作系统。这真的是这样的:

    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()