Python脚本的不同执行方式

 

Python解释器启动流程:main -> Py_BytesMain -> pymain_main -> Py_RunMain -> pymain_run_python

 

pymain_run_command:以python -c "import os;os.system('pause')"的方式运行一行python脚本
pymain_run_module:以python -m http.server的方式运行一个Python模块。另外还要一种不用-m的方式,python http.server,也是调用pymain_run_module,区别就在于这种方式会找package下的__main__.py执行,而python -m的方式会先执行__init__.py,再执行__main__.py
pymain_run_file:python xxx.py的方式执行
pymain_run_stdin:python命令开启命令交互,然后读取用户输入执行
pymain_repl:以-i参数(python -i xxx.py)执行时,在脚本执行完成后,会进入到交互模式而不退出Python解释器

 

static void
pymain_run_python(int *exitcode)
{
    // 略。。。

    if (config->run_command) {
        // 以 python -c "print('123')" 的方式运行
        *exitcode = pymain_run_command(config->run_command);
    }
    else if (config->run_module) {
        // 以 python -m http.server 的方式运行
        *exitcode = pymain_run_module(config->run_module, 1);
    }
    else if (main_importer_path != NULL) {
        // 以 python http.server 的方式运行
        // 与 python -m http.server 的区别在于,会先执行__init__.py,再执行__main__.py
        // 而 python http.server 只会执行__main__.py
        *exitcode = pymain_run_module(L"__main__", 0);
    }
    else if (config->run_filename != NULL) {
        // 以 python xxx.py 的方式执行
        *exitcode = pymain_run_file(config);
    }
    else {
        // 直接执行python命令,然后以交互模式执行用户输入
        *exitcode = pymain_run_stdin(config);
    }

    // 所有上面的4种模式,都可以再增加一个-i的参数,比如 python -i xxx.py
    // 这样上面的流程执行完成后,Python解释器并不会退出,而是开启交互模式继续执行
    pymain_repl(config, exitcode);
    goto done;

error:
    *exitcode = pymain_exit_err_print();

done:
    Py_XDECREF(main_importer_path);
}

  

 

posted @ 2022-03-28 09:18  鸪斑兔  阅读(348)  评论(0编辑  收藏  举报