You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

CPython执行python -c print命令的深度流程与函数调用解析

你对Python执行流程的整体框架认知是准确的。执行命令python -c 'print("Hello, world!")'时,确实会先启动Python解释器进程,传入的源码print("Hello, world!")会依次经过词法分析、语法分析、编译生成字节码,最终交由CPython栈式虚拟机执行。全流程涉及的核心函数及对应作用按执行顺序梳理如下:

进程启动与解释器初始化阶段
  • main(源码路径:./Modules/python.c):C程序标准入口函数。操作系统启动Python二进制程序、完成通用标准C库初始化后首先执行该函数,逻辑非常轻量,仅做快速跳转,不承载解释器核心逻辑。
  • Py_Main(源码路径:./Modules/main.c):解释器启动阶段的核心调度函数。负责完成命令行参数解析(识别-c参数及后续传入的源码字符串)、运行相关环境变量校验、标准输入/输出/错误流的状态适配,所有前置准备完成后触发解释器核心初始化流程。
  • Py_Initialize(源码路径:./Python/pythonrun.c):负责组装CPython运行时的全部核心组件,将普通操作系统进程转换为可运行Python代码的解释器进程:会创建解释器状态结构(存储全局配置、已加载模块等全局运行信息)、线程状态结构(存储当前执行线程的栈帧、异常状态等线程级上下文),完成内置模块sys、builtins的初始化加载,为后续代码执行搭好完整的基础运行环境。
源码编译阶段(词法分析→语法分析→字节码生成)
  • PyParser_ASTFromStringObject(源码路径:./Python/ast.c):接收传入的源码字符串,调度完成前两步解析工作:
    • 词法分析:将连续的源码字符串拆分为独立的词法单元(Token),比如示例代码会被拆分为标识符print、左括号、字符串字面量"Hello, world!"、右括号几个独立单元,过滤掉无意义的空白、注释内容。
    • 语法分析:基于Python官方文法规则,将拆分好的Token流组装为抽象语法树(AST),同时做语法合法性校验,如果代码存在语法错误会在这一步直接抛出SyntaxError。
  • PyAST_CompileObject(源码路径:./Python/compile.c):遍历上一步生成的抽象语法树,将其编译为CPython虚拟机可直接识别的字节码对象(Code Object),同时完成常量池、变量符号表的生成——示例中的字符串常量"Hello, world!"就会在这一步被存入字节码对象的常量表中。
虚拟机执行阶段
  • PyEval_EvalCode(源码路径:./Python/ceval.c):CPython虚拟机的核心执行入口。接收编译好的字节码对象,初始化对应执行栈帧后进入字节码解释循环:逐条读取字节码指令完成对应操作,比如从builtins模块查找print函数对象、将常量表中的"Hello, world!"压入执行栈、触发print函数调用逻辑将字符串输出到标准输出流,全部指令执行完成后回收栈帧、返回执行结果。
深度学习资源推荐
  • CPython对应版本源码:直接阅读源码配合内置注释是理解执行流程最准确的方式,入门阶段重点关注前面提到的几个核心文件即可,不需要一开始就通读全量代码。
  • 《CPython Internals》书籍:从源码层面系统性讲解CPython的编译流程、虚拟机实现、内存管理等核心模块,适合建立完整的知识体系。
  • Python标准库dis模块:可以直接打印小段Python代码编译后的字节码指令,配合源码对照理解虚拟机执行逻辑,比如执行python -m dis -c 'print("Hello, world!")'就能直接看到示例代码对应的全部字节码。

内容的提问来源于stack exchange,提问作者ThreadBucks

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.01 20:01:06