python编译器在执行时,给它指定要执行的源码文件,或者说直接输入源码字符串就可以驱动脚本的执行流程,其基本框架如下:

input层是python编译器用于获取源码的输入方式,事实上Python能够有多种方式将源码信息传递给编译器,例如:
1,执行python -c 然后接着python代码字符串。
2,python -m 然后跟着要执行的模块名
3,python 然后跟着脚本文件的路径
4,通过管道连接方式执行,例如 cat [file] | python

Python解释器不关心代码如何输入,只要它能获取源码内容即可,因此它专门设立了一个输入层来处理源码的读入。一旦获得源码内容后,解释器需要做三个动作,第一个是设置编译选项,如果你用过g++, gcc这类编译器,你一定了解执行时要有很多设置开关或选项,图中的configuration模块就负责这些选项的设置,State用来存储脚本中设定的各种变量,Module通过解读脚本后生成的一种便于脚本执行的数据结构。

以下我们会描述一些代码和数据结构,我们大概知道即可,不需要掌握或完全理解。我们看看解释器在运行脚本前进行相关配置的代码,相关代码在python目录下的initconfig.h和initconfig.c中。打开initconfig.c,然后搜索PyPreConfig结构体对象,然后按住ctrl并点击它就可以打开它的定义,它有些字段需要注意:

1,int allocator , 该字段对应内存分配器类型,它其实是个枚举值,用来选取不同的内存分配器。
2,int isolatd, 设置隔离模式,应该对应python虚拟执行环境,在该环境里进行pip安装或是环境变量配置不会对全局环境产生影响。
3,int utf8_mode , 设置utf-8模式

在initconfig.c中搜索PyConfig,这个结构体用于运行时配置,例如设置解释器在执行脚本时是出于调试模式还是优化模式,它还记录了一些涉及到运行时的环境变量配置。接下来我们在解释器源码中设置断点对其执行进行调试体验,操作如下图所示:

首先在python模块右键,选中属性,点击调试,在命令参数中输入python -v -c “print(‘hello world’)”,然后在函数config_parse_cmdline中设置断点,该函数应该在1875行,这个函数用于解读执行python解释器时的命令行参数,设置好后点击F5启动调试,我们会看到VS停在断点设置的地方,然后点击F10单步,我们可以看看该函数前面几个变量的内容:
从中我们能看到Python解释器对应的可执行文件为python_d.exe,继续往下走可以看到代码进入case ‘v’,这里打开了verbose模式,这样Python解释器执行时会把很多信息打印出来。接下来在main.c中的pymain_run_command函数中设置断点,这个函数会调用一系列函数执行源码,该文件在Module目录下,

里面的PyRun_SimpleStringFlags函数作用就是执行源码,我们单步运行该函数,然后打开控制台就会看到hello输出来了。上面代码中函数PyRun_SimpleStringFlags的作用就是创建一个Module对象,一个Module对象就是含有__main__入口的可执行模块,

本节的目的就是体会一下如何调试Python解释器,获得一些感性认识,后面我们会进入到Python解释器的词法解析,和语法解析过程,这些内容更编译原理紧密结合,相关的知识可以从下面链接获得:

更多精彩内容请看这里

内核级python:调试Python编译器源码相关推荐

  1. 【GitHub探索】python调试利器——pysnooper源码分析

    前言 这次又开了个新坑--GitHub探索,主要内容是试水当期GitHub上较火的repo 虽然top榜上各路新手教程跟经典老不死项目占据了大半江山,但清流总是会有的. 第一期就试水一下pysnoop ...

  2. 内核级pyhon:编译python编译器和语法修改

    现在一涉及到编程语言几乎就离不开python,甚至这门语言已经成了割韭菜的手段,各种1元学习python的引流课程层出不穷,从这些现象可以体会到python语法设计之成功.它基本上实现了其创作者的初衷 ...

  3. Python与Seo工具源码,全网搜录查询助手exe

    Python与Seo工具源码,全网搜录查询助手exe 很多人都说,seo是一个玄学,诚然,一方面是排名,另一方面是收录,尤其是对于渣渣而言,当然收录和排名都需要去验证,去查询,乃至去监控,大批量的话, ...

  4. python浪漫代码-python七夕浪漫表白源码

    本文实例为大家分享了python七夕浪漫表白的具体代码,供大家参考,具体内容如下 from turtle import * from time import sleep def go_to(x, y) ...

  5. 照片背景底色更换工具二(python+flask网页版源码及打包)

    照片背景底色更换工具二(python+flask网页版源码及打包) 所有源码 文件结构 static images huaman_src_test.jpg huaman_result_test.png ...

  6. Python个人网盘源码、云盘系统源程序,基于Django+Mysql

    Python个人网盘源码.云盘系统源程序,基于Django+Mysql 1.安装依赖 pip install -r requirements.txt 2.检查配置文件,修改邮箱和数据库配置 # myc ...

  7. python爬虫教程:Scrapy框架爬取Boss直聘网Python职位信息的源码

    今天小编就为大家分享一篇关于Scrapy框架爬取Boss直聘网Python职位信息的源码,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧 分析 使用Crawl ...

  8. python金融实战 源代码_穆棱市seo总代直销python金融量化营业实战课程 python量化项目实战源码+课件+视频...

    python金融量化生意实战课程 python量化项目实战源码+课件+视频 1. 自愿化生意综述 重要实质: 课程实质综述,自愿化/算法生意先容,python正在自愿生意中的使用简介 2. 量化生意体 ...

  9. 图片坐标提取软件/图片坐标点和像素点颜色提取软件/图片坐标获取工具/Python图片坐标获取源码/图片像素坐标获取软件/python tkinter 图片显示(完全开源)

    该软件使用python写的,可以提取像素点的坐标还有也能获取像素点的16进制数据RGB565和RGB888(RGB888仅最新的源码才支持),可以单点坐标也可以按键坐标,甚至可以使用简单的左右键配合使 ...

  10. 反编译python 生成的exe源码

    反编译python 生成的exe源码 记录反编译exe工具使用 工具准备 – pyinstxtractor.py – uncompyle6 – sublime Text(或者其他的二进制编辑工具) 一 ...

最新文章

  1. sqlalchemy exists 子查询_学好ORM框架SQLAlchemy面试必问
  2. 去除字符串中指定字符
  3. IOS中UITableView异步加载图片的实现
  4. grunt使用小记之开篇:grunt概述
  5. C#中的事件和委托(续)
  6. 嵌套查询和连接查询的效率_Elasticsearch 7.x Nested 嵌套类型查询 | ES 干货
  7. C程序设计语言现代方法13:字符串
  8. NVM:切换node版本后无法使用npm全局包
  9. 分享一个响应式电商网站前端模板
  10. linux网络端口失效( Device eth0 does not seem to be present,delaying initialization)解决方法
  11. 电脑软件测试英雄联盟,揭秘英雄联盟的自动化测试
  12. Hive3.1.2安装指南
  13. Python疫情数据分析+数据可视化展示
  14. kali下载速度慢_Linux系统软件安装更新下载太慢解决方法(转载)
  15. 048 《20-30岁,我拿十年做什么》小感
  16. 风影ASP.NET基础教学 13 NET3.0特性补充
  17. 两个进程同时访问同一个文件
  18. dsp指令ixh_C24XX系列DSP移位指令总结
  19. linux 内存大页,Linux大页内存管理等---菜鸟初学
  20. 对移动硬盘里的文件夹加密

热门文章

  1. VM centOS7安装克隆(还是有部分人操作遇到问题,特分享,尤其是初学者)
  2. NFV、DPDK以及部分用户态协议研究
  3. 量子计算与量子信息之Python-qiskit实现量子隐形传态
  4. HTTP协议详解 简单易懂超详细整理版
  5. 重庆北大青鸟解放碑校区 A08班 张海龙组 作品名称:航空售票系统
  6. ext4/ext3文件系统的保留空间
  7. LatinIME默认打开各国语言
  8. 哔哩哔哩如何一键给全部粉丝发私信
  9. 圆滑描边 css,【CSS 学习】CSS 文本描边效果
  10. 基于JAVA物资物流管理系统计算机毕业设计源码+系统+lw文档+部署