『Python』源码解析_源码文件介绍
2018-04-09 10:02
375 查看
本篇代码针对2.X版本,与3.X版本细节不尽相同,由于两者架构差别不大加之本人能力有限,所以就使用2.X体验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。
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");
这里的函数int_print是在打印python整形数字时调用,我们设定当打印-999时额外输出字符串"I am in int_print"。
![](https://images2018.cnblogs.com/blog/1161096/201804/1161096-20180410081024649-857790431.png)
会创建一个123.txt文件,并将所有输出到命令行的输出转而写进文件。
一、主要文件夹内容
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"。
![](https://images2018.cnblogs.com/blog/1161096/201804/1161096-20180410081024649-857790431.png)
sys.stdout
介绍一下sys.stdout,如下交互界面输入,在交互界面不会得到输出,import sys sys.stdout = open('123.txt', 'w') sys.stdout
会创建一个123.txt文件,并将所有输出到命令行的输出转而写进文件。
相关文章推荐
- python 源码解析 object 定义的介绍
- python开源爬虫框架scrapy源码解析(五)
- 深入源码解析Python中的对象与类型
- IIS源码泄露及文件类型解析错误
- 开源工作流Fireflow源码分析之流程文件解析
- Java 集合系列13之 WeakHashMap详细介绍(源码解析)和使用示例
- .properties文件读取及占位符${...}替换源码解析
- Java 集合系列03之 ArrayList详细介绍(源码解析)和使用示例
- NGINX----源码阅读---配置文件解析
- 【RocketMQ源码深度解析】整体介绍&IDE编译并启动RocketMQ的第一个例子
- MyBatis源码——解析MyBatis配置文件
- proc源码解析(一)--proc文件系统的内容(转自若木)
- python解析xml文件
- Python编程时.py与.pyc文件的介绍(区别)
- Android 多线程下载文件原理霸气解析介绍 -----线程池管理和任务队列 (2)
- 【python图像处理】tiff文件的保存与解析
- Android平台下SeeJoPlayer视频播放器(功能介绍及源码解析,附源码)
- 单文件PHP版视频解析源码(中间件)
- Java 集合系列03之 ArrayList详细介绍(源码解析)和使用示例
- pyc文件反编译到Python源码