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解释器
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 | 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); } |
分类:
Python源码剖析
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· DeepSeek “源神”启动!「GitHub 热点速览」
· 微软正式发布.NET 10 Preview 1:开启下一代开发框架新篇章
· C# 集成 DeepSeek 模型实现 AI 私有化(本地部署与 API 调用教程)
· DeepSeek R1 简明指南:架构、训练、本地部署及硬件要求
· 2 本地部署DeepSeek模型构建本地知识库+联网搜索详细步骤