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);
}
浙公网安备 33010602011771号