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); }