『Python』源码解析_源码文件介绍
本篇代码针对2.X版本,与3.X版本细节不尽相同,由于两者架构差别不大加之本人能力有限,所以就使用2.X体验python的底层原理了。
一、主要文件夹内容
Include :该目录下包含了Python提供的所有头文件,如果用户需要自己用C或C++来编写自定义模块扩展Python,那么就需要用到这里提供的头文件。
Lib :该目录包含了Python自带的所有标准库,Lib中的库都是用Python语言编写的。
Modules :该文件夹中包含了所有用C语言编写的模块,比如ramdom,cStringIO等,Modules中的模块是那些对速度要求非常严格的模块。而有一些对速度没有太严格要求的模块,比如os,就是用Python编写,并且放在Lib目录下
Parser :Parser目录中包含了Python解释器中的Scanner和Parser部分,即对Python源代码进行词法分析和语法分析的部分。除了这些,Parser目录下还包含了一些有用的工具,这些工具能够根据Python语言的语法自动生成Python语言的词法和语法分析器,与YACC非常类似。
Objects :该目录中包含了所有Python的内建对象,包括整数,list,dict等;同时,该目录还包括了Python在运行时需要的所有的内部使用对象的实现
Python :该目录下包含了Python解释器中的Compiler和执行引擎部分,是Python运行的核心所在。
PCBuild :包含了Visual Studio 2003工程文件,研究Python源代码就从这里开始,实际使用中我使用的是VS 2015。
二、几个标准函数
1、输出python对象的接口函数
python/外部依赖项/object.h/
PyAPI_FUNC(int) PyObject_Print(PyObject *, FILE *, int);
2、从C的原生字符数组创建出Python字符串对象
PyObject* str = PyString_FromString("I am in int_print");
3、将Python的整数对象转化为C中的int型
PyInt_AsLong(v)
4、获取Python中sys对象(获取形式采取对象的字符串)
PyObject* out = PySys_GetObject("stdout");
三、修改源码示意
pythoncore/Objects/intobject.c
/* ARGSUSED */
static int
int_print(PyIntObject *v, FILE *fp, int flags)
/* flags -- not used but required by interface */
{
// add by hellcat
if (PyInt_AsLong(v) == -999) { // 将python的int对象转换为c的整形并做大小判断
PyObject* str = PyString_FromString("I am in int_print"); // 将c的字符串转换为python的字符串对象
PyObject* out = PySys_GetObject("stdout"); // 获取python的sys库中的stdout属性
if (out != NULL) { // 如果该属性存在值
PyObject_Print(out, stdout, 0); // 打印python对象到stdout(屏幕输出),打印标准输出的值
printf("\n");
PyObject_Print(str, stdout, 0); // 打印我们之前写的字符串
printf("\n"); // 打印换行
}
} fprintf(fp, "%ld", v->ob_ival);
return 0;
}
这里的函数int_print是在打印python整形数字时调用,我们设定当打印-999时额外输出字符串"I am in int_print"。

sys.stdout
介绍一下sys.stdout,如下交互界面输入,在交互界面不会得到输出,
import sys
sys.stdout = open('123.txt', 'w')
sys.stdout
会创建一个123.txt文件,并将所有输出到命令行的输出转而写进文件。
『Python』源码解析_源码文件介绍的更多相关文章
- 『Python』源码解析_从ctype模块理解对象
1.对象的引用计数 从c代码分析可知,python所有对象的内存有着同样的起始结构:引用计数+类型信息,实际上这些信息在python本体重也是可以透过包来一窥一二的, from ctypes impo ...
- 《Flink 源码解析》—— 源码编译运行
更新一篇知识星球里面的源码分析文章,去年写的,周末自己录了个视频,大家看下效果好吗?如果好的话,后面补录发在知识星球里面的其他源码解析文章. 前言 之前自己本地 clone 了 Flink 的源码,编 ...
- AOP源码解析:AspectJAwareAdvisorAutoProxyCreator类的介绍
AspectJAwareAdvisorAutoProxyCreator 的类图 上图中一些 类/接口 的介绍: AspectJAwareAdvisorAutoProxyCreator : 公开了Asp ...
- spring源码解析——spring源码导入eclipse
一.前言 众所周知,spring的强大之处.几乎所有的企业级开发中,都使用了spring了.在日常的开发中,我们是否只知道spring的配置,以及简单的使用场景.对其实现的代码没有进行深入的了 ...
- 『TensorFlow』SSD源码学习_其四:数据介绍及TFR文件生成
Fork版本项目地址:SSD 一.数据格式介绍 数据文件夹命名为VOC2012,内部有5个子文件夹,如下, 我们的检测任务中使用JPEGImages文件夹和Annotations文件夹. JPEGIm ...
- nginx源码学习_源码结构
nginx的优秀除了体现在程序结构以及代码风格上,nginx的源码组织也同样简洁明了,目录结构层次结构清晰,值得我们去学习.nginx的源码目录与nginx的模块化以及功能的划分是紧密结合,这也使得我 ...
- MIT 2012分布式课程基础源码解析一-源码概述
课程主页 课程介绍:本课程会在给出的源码的基础上要求完成8个lab Lab overviewLab 1 - Lock ServerLab 2 - Basic File ServerLab 3 - MK ...
- 源码解析-knockout源码准备
准备包括心理和资源两方面. 心理 我看过一句话说,当你用一个框架时,不要忙着看一遍使用教程就开始写项目,先去看看框架原理. 这句话我深以为然.现今前端快速发展,很多前端攻城狮都很茫然:框架更新太快了, ...
- 开源项目源码解析-PhotoView 源码解析
1. 功能介绍 特性(Features): 支持 Pinch 手势自由缩放. 支持双击放大/还原. 支持平滑滚动. 在滑动父控件下能够运行良好.(例如:ViewPager) 支持基于 Matrix 变 ...
随机推荐
- 在window 2008r2开发服务器上安装MSMQ消息队列
1.打开”服务器管理器“------”功能“-------”添加功能“,勾选”消息队列“,如下图: 如果之前已经勾选,则忽略此步. 2.”功能“------”消息队列“------”专有对列“---- ...
- 浅尝 Vue 中的 computed 属性 与 watch
对于 computed 的理解: ①.computed 用来监控自己定义的变量,该变量不在 data 里面声明,直接在 computed里面定义,然后就可以在页面上进行双向数据绑定展示出结果或者用作其 ...
- jQuery:实现图片按需加载的方法,当要显示内容的高度超过了页面的高度,按需加载,根据滚动条的位置来判断页面显示的内容
实现图片按需加载的方法,当要显示内容的高度超过了页面的高度,按需加载,根据滚动条的位置来判断页面显示的内容 这个类似于京东或淘宝页面,根绝页面的滚动,显示下面的内容 如下图所示,一开始并不是所有的图片 ...
- 高性能Nginx服务器-反向代理
Nginx Nginx是一款轻量级的Web 服务器/反向代理服务器及电子邮件(IMAP/POP3)代理服务器,并在一个BSD-like 协议下发行.由俄罗斯的程序设计师Igor Sysoev所开发,供 ...
- python基础之 列表,元组,字典
other help(str.strip) #查看是否有返回值以及返回值类型[] :称为索引操作符 1.列表 列表相比字符串来说能存储大量数据的python的基本数据类型,并且也拥有字符串的一些方法( ...
- 八、UIViewController们之间的协作——Segue
概述 正所谓“一生二,二生三,三生万物”,1个UIViewController没什么花样,多个UIViewController相互协作就有了各式各样丰富多彩的APP.但是UIViewControlle ...
- Linq动态查询
public class ExpressionCall { List<Customer> customers = new List<Customer>() { new Cust ...
- day07 Python文件操作
一,文件操作基本流程 #1. 打开文件,得到文件句柄并赋值给一个变量 f=open('a.txt','r',encoding='utf-8') #默认打开模式就为r #2. 通过句柄对文件进行操作 d ...
- day01 格式化输出和while循环的两个小练习
练习1.模拟登陆判断(3次机会) r_name = 'xianyu' r_password = ' i = 3 # 用来控制循环次数 while i > 0: name = input('请输入 ...
- 抓包工具 GOOGLE
chrome://net-internals/#events GOOGLE浏览器直接输入