精华内容
下载资源
问答
  • Python源码目录

    千次阅读 2017-09-28 10:50:14
    Python源码目录 从Python.org中下载源代码压缩包并解压,我下载的是Python2.7.12,解压后:   对于主要的文件夹做出介绍: Include:包含Python提供的所有头文件,如果需要自己使用C或者C++编写...

    http://www.cnblogs.com/ybjourney/p/6139461.html

    写的很好的一篇文章。

    Python源码目录

    从Python.org中下载源代码压缩包并解压,我下载的是Python2.7.12,解压后:

     

    对于主要的文件夹做出介绍:

    Include:包含Python提供的所有头文件,如果需要自己使用C或者C++编写自定义模块扩展Python,就需要用到这里的头文件;

    Lib: 包含Python自带的所有标准库,全部由Python语言编写;

    Modules:包含了所有使用C语言编写的模块;

    Parser:Python解释器中的Scanner和Parser(对Python代码进行词法分析和语法分析),这里还包含一些能根据Python语言的语法自动生成Python词法和语法功能的工具;

    Objects:所有Python的内建对象;

    Python:Python解释器中的Compiler和执行引擎部分,是Python运行的核心所在!!!

    Python中的对象

      对象可以说是Python最核心的一个概念,在Python的世界里,一切都是对象。我们知道Python是由C编写的,C并不是一个面向对象语言,而由C编写的Python确实面向对象的,那么它的对象机制是如何实现的呢?

      对于人的思维,对象是可以形象描述的,但是对于计算机而言,对象是一个抽象的概念,计算机所知道的一切都是字节。关于对象,通常的说法是,对象是数据以及基于这些数据的操作的集合,在计算机中,一个对象实际就是把一片被分配的内存空间,且这片内存在更高层次可作为一个整体,这个整体就是一个对象。

      在Python中,对象就是C中的结构体在堆上申请的一块内存。

    对象机制的基石——Pyobject
    在Python中,所有的东西都是对象,而所有的对象都拥有一些相同的内容,Python中的这些内容都是在object.h中的Pyobject中定义的。

    1
    2
    3
    typedef struct _object {
        PyObject_HEAD
    } PyObject;

    定长对象和变长对象

    Python除了Pyobject对象之外,还有一个表示这类对象的结构体pyVarObject,pyVarobject其实就是对pyobject的一个扩展。
    那么站在源码的角度上分析,变长对象是在pyVarobject中添加了可变长度数据的对象,也就是ob_size,定义了所容纳元素的个数。定长对象和变长对象的区别是:定长对象的不同对象占用的内存大小是一样的,变长对象的不同对象占用的内存可能是不一样的。比如整数对象'1'和'100'占用的内存大小都是sizeof(PyIntObject),而字符串对象"me"和"you"占用的内存大小就不一样。

    Python对象的多态性

      面向对象中一个重要的特性是多态,那么Python是如何实现多态的呢?
      在Python创建一个对象时,会分配内存,进行初始化,然后Python内部会使用一个PyObject*变量来保存和维护这个对象,Python中的所有对象均是如此。比如创建一个PyIntObject对象(整数对象),不是通过PyIntObject *变量来保存和维护这个对象,而是通过PyObject *,正因为所有对象均如此,所以Python内部各个函数之间传递的都是一种范型指针(Pyobject*),而这个指针所指的对象究竟是什么类型的,我们是不知道的,只能从指针所指对象的ob_type域动态进行判断,而正是这个域,Python实现了多态。

    引用计数

      和C或C++不同,Python选择使用语言本身负责内存的管理和维护,也就是垃圾收集机制,代替程序员进行繁重的内存管理工作,而引用计数刚好是Python垃圾收集机制的一部分。
      Python通过对一个对象的引用计数来管理和维护对象在内存中的存在与否。Python中的一切皆是对象,在所有的对象中有一个ob_refcent变量,维护这对象的引用计数,从而也决定该对象的创建与消亡。
    在Python中,使用Py_INCREF(op)和Py_DECREF(op)两个宏来增加和减少一个对象的引用计数,在每一个对象创建的时候,Python提供了一个Py_NewReference(op)宏来将对象的引用计数初始化为1。
      当一个对象的引用计数为0时,与该对象对应的析构函数将被调用, 但是调用析构函数并不一定是调用free释放内存空间,为了避免频繁的申请、释放内存空间,Python中使用的是内存对象池,维护一定大小的内存对象池,调用析构函数时,对象占用的空间将归还到内存池中。

    Python中的整数对象
      在Python的所有对象中,整数对象最简单且使用最频繁,故我们首先学习整数对象。关于整数对象的源码在Objects.intobjects.c中,整数对象是通过PyIntObject对象来完成的,在创建一个PyIntObject对象之后,就再也不能改变该对象的值了。定义为:

    1
    2
    3
    4
    typedef struct {
        prObject_HEAD;
        long ob_ival;
    }PyIntObject;

      可以看到,Python中的整数对象其实是对C中long的一个简单封装,也就是整数对象维护的数据的长度在对象定义时就已经确定了,就是C中long的长度。
      在Python中,整数的使用是很广泛的,对应的,它的创建和释放也将会很频繁,那么如何设计一个高效的机制,使得整数对象的使用不会成为Python的瓶颈?在Python中是使用整数对象的缓冲池机制来解决此问题。使用缓冲池机制,那意味着运行时的整数对象并不是一个个独立的,而是相关联结成一个庞大的整数对象系统了。
    小整数对象
      在实际的编程中,数值比较小的整数,比如1,2,等等,这些在程序中是频繁使用到的,而Python中,所有的对象都存活在系统堆上,也就是说,如果没有特殊的机制,对于小整数对象,Python将一次次的malloc在堆上申请空间,然后free,这样的操作将大大降低了运行效率。
    那么如何解决呢?Python中,对小整数对象使用了对象池技术。
    那么又有一个问题了,Python中的大对象和小对象如何区分呢?嗯,Python中确实有一种方法,用户可以调整大整数和小整数的分界点,从而动态的确定小整数的对象池中应该有多少个小整数对象,但是调整的方法只有自己修改源代码,然后重新编译。
    大整数对象
      对于小整数,小整数对象池中完全的缓存PyIntObject对象,对于其它对象,Python将提供一块内存空间,这些内存空间将由这些大整数轮流使用,也就是谁需要的时候谁使用。
      比如,在Python中有一个PyIntBlock结构,维护了一块内存,其中保存了一些PyIntObject对象,维护对象的个数也可以做动态的调整。在Python运行的某个时刻,有一些内存已经被使用,而另一些内存则处于空闲状态,而这些空闲的内存必须组织起来,那样,当Python需要新的内存时,才能快速的获得所需的内存,在Python中使用一个单向链表(free_list)来管理所有的空闲内存。

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    #define BLOCK_SIZE      1000    /* 1K less typical malloc overhead */
    #define BHEAD_SIZE      8       /* Enough for a 64-bit pointer */
    #define N_INTOBJECTS    ((BLOCK_SIZE - BHEAD_SIZE) / sizeof(PyIntObject))
     
    struct _intblock {
        struct _intblock *next;
        PyIntObject objects[N_INTOBJECTS];
    };
     
    typedef struct _intblock PyIntBlock;
     
    static PyIntBlock *block_list = NULL;
    static PyIntObject *free_list = NULL;

    创建
      现在,我们已经大体知道Python中整数对象系统在内存是一种怎样的结构了,下面将介绍一个个PyIntObject是怎样的从无到有的产生。主要分为两步:
      如果小整数对象池机制被激活,则尝试使用小整数对象池;如果不能使用小整数对象池,则使用通用整数对象池。

    以PyInt_FromLong说明:

     

    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
    PyObject *
    PyInt_FromLong(long ival)
    {
        register PyIntObject *v;
    #if NSMALLNEGINTS + NSMALLPOSINTS > 0
        if (-NSMALLNEGINTS <= ival && ival < NSMALLPOSINTS) {
            v = small_ints[ival + NSMALLNEGINTS];
            Py_INCREF(v);
    #ifdef COUNT_ALLOCS
            if (ival >= 0)
                quick_int_allocs++;
            else
                quick_neg_int_allocs++;
    #endif
            return (PyObject *) v;
        }
    #endif
        if (free_list == NULL) {
            if ((free_list = fill_free_list()) == NULL)
                return NULL;
        }
        /* Inline PyObject_New */
        v = free_list;
        free_list = (PyIntObject *)Py_TYPE(v);
        PyObject_INIT(v, &PyInt_Type);
        v->ob_ival = ival;
        return (PyObject *) v;
    }

     


    展开全文
  • python 源码文件: Python-2.7.3.tgz 编译 (1)解压 Python-2.7.3.tgz (2)进入 Pcbuild 文件夹,使用 vs 2013 打开 pybuild.sln (vs 解决方案),进入 vs 2013 IDE 环境 (3)右键解决方案’pcb

    参考 windows环境下编译python

    准备

    • VS 2013(其实 vs 版本编译的差异不大,设置也基本相同)
    • python 源码文件: Python-2.7.3.tgz

    编译

    • (1)解压 Python-2.7.3.tgz

    • (2)进入 Pcbuild 文件夹,使用 vs 2013 打开 pybuild.sln (vs 解决方案),进入 vs 2013 IDE 环境

    • (3)右键解决方案’pcbuild’ ⇒ 属性

      • a. 通用属性

        单启动项目 ⇒ 选择 python

      • b. 配置属性

        • 左上角的【配置】⇒ Debug(Release 可能会报错)
        • 项目上下文 ⇒ 仅选中 python/pythoncore
    • (4)首先编译 make_buildinfo 和 make_versioninfo

      分别右键 make_buildinfo/make_versioninfo ⇒ 仅用于项目 ⇒ 仅重新生成

    • (5)编译此解决方案,最终会在开始的 PCbuild文件夹下生成 python_d.exe 和 python27_d.dll 文件,可双击 python_d.exe,进入 python 命令行环境。

    展开全文
  • Python源码阅读(一)

    万次阅读 多人点赞 2019-07-07 10:28:18
    最近想读读Python源码,任何东西学习方法基本都是一样的,先从总体框架进行了解,再从自己侧重的方面逐步深入。 1. Python总体架构 左边是Python提供的大量的模块、库以及用户自定义的模块。比如在执行import os...

    最近想读读Python源码,任何东西学习方法基本都是一样的,先从总体框架进行了解,再从自己侧重的方面逐步深入。

    1. Python总体架构

    在这里插入图片描述

    左边是Python提供的大量的模块、库以及用户自定义的模块。比如在执行import os时,这个os就是Python内建的模块,当然用户还可以通过自定义模块来扩展Python系统。
    右边是Python的运行时环境,包括对象/类型系统(Object/Type structures)、内存分配器(Memory Allocator)和运行时状态信息(Current State of Python)。运行时状态维护了解释器在执行字节码时不同的状态(比如正常状态和异常状态)之间切换的动作,我们可以将它视为一个巨大而复杂的有穷状态机。内存分配器则全权负责Python中创建对象时,对内存的申请工作,实际上它就是Python运行时与C中malloc的一层接口。而对象/类型系统则包含了Python中存在的各种内建对象,比如整数、list、dict,以及各种用户自定义的类型对象。
    在中间的部分,可以看到Python的核心——解释器(interpreter),或者成为虚拟机。在解释器中,箭头的方向指示了Python运行过程中的数据流方向。其中Scanner对应词法分析,将文件输入的Python源代码或从命令行输入的一行行Python代码切分为一个个的token;Parser对应语法分析,在Scanner的分析结果上进行语法分析,建立抽象语法树(AST);Compiler是根据建立的AST生成指令集合——Python字节码(byte code),就像Java编译器和C#编译器所做的那样;最后由Code Evaluator来执行这些字节码。因此,Code Evaluator又可以被称为虚拟机。

    在解释器与右边的对象/类型系统、内存分配器之间的箭头表示“使用”关系;而与运行时状态之间的箭头表示“修改”关系,即Python在执行过程中会不断地修改当前解释器所处的状态,在不同状态之间切换。


    2. Python源码的组织

    Python源码下载地址:https://www.python.org/downloads/
    Python源码压缩包解压后目录结构为:
    在这里插入图片描述

    Include:该目录下包含了Python提供的所有文件头,如果用户需要自己用C或者C++来编写自定义模块扩展Python,那么就需要用到这里提供的头文件。
    Lib:该目录包含了Python自带的所有标准库,Lib中的库都是用Python语言编写的。
    Modules:该目录中包含了所有用C语言编写的模块,比如random、cStringIO等。Modules中的模块是那些对速度要求非常严格的模块,而有一些对速度没有太严格要求的模块,比如os,就是用Python编写,并且放在Lib目录下的。
    Parser:该目录中包含了Python解释器中的Scanner和Parser部分,即对Python源码进行词法分析和语法分析的部分。除了这些,Parser目录下还包含了一些有用的工具,这些工具能够根据Python语言的语法自动生成Python语言的词法和语法分析器,与YACC非常类似。
    Objects:该目录中包含了所有Python的内建对象,包括整数、list、dict等。同时,该目录还包括了Python在运行时需要的所有的内部使用对象的实现。
    Python:该目录中包含了Python解释器中的Compiler和执行引擎部分,是Python运行的核心所在。
    PCBuild:包含了Visual Studio的工程文件,研究Python源码就从这里开始。


    3. 学习目标

    接下来学习目标是彻底剖析Python在运行时的行为,从而为彻底理解Python的运行机制
    因此,接下来主要从三个方面进行学习:
    (1)Python内建对象
    (2)Python虚拟机:分析Python虚拟机执行字节码指令的过程。Python是如何通过虚拟机实现各种表达式、控制流、异常机制、函数机制及类机制。
    (3)Python高级话题:剖析Python的运行环境以及一些高级话题。Python运行环境的初始化、动态加载机制、多线程机制和内存管理机制。

    展开全文
  • Python 源码编译安装

    千次阅读 2018-04-05 09:19:57
    首先当然是要先下载源码了,Python源码官网即可下载,不在这里啰嗦了。 下载之后解压 tar -zxvf Python-3.7.0b3 利用解压软件解压的可以忽略这一条命令哈。 然后开始正式进行安装过程了...

    Python 源码编译安装

    体验Python3.7 打算直接利用源码编译安装,发现安装过程中的一些坑,在这里记录一下。

    小注: 以下均在MAC-OS测试通过

    首先当然是要先下载源码了,Python源码官网即可下载,不在这里啰嗦了。

    下载之后解压 tar -zxvf Python-3.7.0b3

    利用解压软件解压的可以忽略这一条命令哈。

    然后开始正式进行安装过程了

    • ./configure --enable-optimizations --prefix=/usr/local/python3.7/

    prefix 是安装路径,可以自己选择,–enable-optimizations 为最优安装,建议使用这个参数

    • 执行完成之后,修改Modules/Setup文件中的
    # Socket module helper for SSL support; you must comment out the other
    # socket line above, and possibly edit the SSL variable:
    SSL=/usr/local/ssl # 这个是ssl 安装路径,如果不是这个要自己指定,Mac下我默认用的Brew 安装所以我改成了我自己路径
    _ssl _ssl.c \
       -DUSE_SSL -I$(SSL)/include -I$(SSL)/include/openssl \
       -L$(SSL)/lib -lssl -lcrypto
    • make & make install 最后一步,安装结束

    这样Python就通过源码编译安装成功了, 附一张运行成功截图嘻嘻。
    Python3.7

    然后自己需要什么库可以自己尝试安装,在这里不多赘述了,这个装完之后是可以直接使用pip的。

    到此为止,记录完了,欢迎大家吐槽哈。

    展开全文
  • PYTHON的一些轮廓提取方法 python源码

    千次阅读 2019-12-21 15:14:33
    PYTHON的一些轮廓提取方法 python源码 from PIL import Image import numpy as np img=np.array(Image.open(r’C:\Users\dudakuan\Pictures\Camera Roll\yanglvbohou.jpeg’).convert(‘L’)) #img=np.array(Image....
  • python源码剖析笔记1——Python对象初见 工作整两年了,用python最多,然而对于python内部机制不一定都清楚,每天沉醉于增删改查的简单逻辑编写,实在耗神。很多东西不用就忘记了,比如C语言,正好,python源码用C...
  • 懒人查看python源码方法

    万次阅读 2018-01-23 17:28:27
    想查看python源码又不想费力找源码文件地址,可以通过以下几行代码 简要查看源码. import module_name with open(str(module_name.__file__),"r") as f: print (f.read()) 再把代码贴到IDE中即可
  • python源码下载

    千次阅读 2012-06-05 00:05:48
    python源码下载 (2010-12-18 23:11) 不知道python.org一直被堵在墙外…  1、http://ftp.python.org/ftp/python/  2、http://www.python.org/ftp/python/
  • Python源码剖析》学习笔记

    千次阅读 2014-11-29 15:57:04
    最近阅读《Python源码剖析》一书, 对python底层实现有了更为深刻的理解,特在此记录学习笔记。 共有六篇笔记,原文发表在PythonTip。 Python源码剖析笔记---第一章:Python对象初探 Python源码剖析笔记---...
  • win7下编译python源码

    千次阅读 2015-08-10 10:58:46
    win7下编译python源码 下载源码: 打开网页:https://www.python.org/downloads/release/python-2710/ 下载完成后解压即可 查看文档: 其实最最可利用的资源是官方的文档,我们进入...
  • python 下载Python 源码包下载下载python源码压缩包安装详解 步骤 tar xf Python-3.5.2.tgz cd Python-3.5.2 ./configure --prefix=/usr/local --enable-shared make make install 命令详解 Linux下源码的安装一般由...
  • Python源码保护

    千次阅读 2020-03-16 21:51:11
    python是先把源码py文件编译成pyc或者pyo,然后由python的虚拟机执行。最简单的加密方法是将编译后的pyc二进制文件发布,详情可以参考blog。但与其他语言一样编译后的产生的pyc依然可以通过反编译得...
  • python源码安装关于ssl的坑

    千次阅读 2018-11-20 01:14:11
    python源码安装关于ssl的坑 之所以用源码安装也是因为pip安装依赖的时候出现错误的,很奇特的错误。原本都没有注意到这个问题,如果不是用pipreqs ./导出当前项目的依赖包还不会意识到这个问题。两个项目,同样的...
  • 简单实现卓易刷微信步数的Python源码 本文参考链接:https://blog.csdn.net/a1005398026/article/details/99583356 参考了上文作者的PHP版本,改写成了Python版本,一手调用卓易官方接口,代码逻辑简单,供大家参考...
  • python源码大全-python代码大全

    千次阅读 2020-10-30 23:12:50
    例如:想了解python做数据可视化的工作。 我们可以从互联网找一些python做数据可视化的代码进行阅读,调试和迁移。 这样做的好处,突出实用性。 同时,我们在结合联想的学习方法,对所用到的可视化函数,做个更深入...
  • 类似py2exe软件真的能保护python源码吗背景最近写了个工具用于对项目中C/C++文件的字符串常量进行自动化加密处理,用python写的,工具效果不错,所以打算在公司内部推广。为了防止代码泄露就考虑不采用直接给源码...
  • Python源码中文注释出错

    千次阅读 2011-03-26 22:43:00
    python源码中使用中文注释,可能会报错,解决方案是:  # coding=gb2312 #中文注释在这里 print("Hello World!") 或者使用方案: # -*- coding: gb2312 -*- #中文注释在这里 print...
  • Python源码学习七 .py文件的解释

    千次阅读 2013-10-31 22:27:37
    Python源码太复杂了... 今天看了下对.py文件的parse, 云里雾里的 py文件是最简单的 a = 10 print(a) 开始分析,堆栈如图 把 static node * parsetok(struct tok_state *tok, grammar *g, int start, ...
  • python 源码编译

    千次阅读 2013-03-02 13:23:00
    1、从官网下载 python25 的源码  http://www.python.org/ftp/python/2.5.6/Python-2.5.6.tgz 2、将源码从window 端ftp 上传到 linux 服务器 D:\>ftp 169.254.214.222 连接到 169.254.214.222。 220...
  • python 源码分析 基本篇

    千次阅读 2019-02-03 13:10:24
    以后都在 github 更新,请参考Cpython Internals 版本 第一步克隆 Cpython 仓库到本地, 切换到...git clone https://github.com/python/cpython.git git reset --hard ab54b9a130c88f708077c2ef6c4963b632c132b...
  • 最近在研读Python源码剖析一书,此书相当不错,如果自己冲动的去分析Python源码可能会到处碰“鼻”,看到此书时是09年,那时为了研究内存机制才发现有这么一本书,但是工作太忙,根本没时间去分析源码,到了2010年,...
  • Python源码剖析》上架

    万次阅读 热门讨论 2008-07-21 11:03:00
    经过几年的打磨,在博文视点的大力支持下,《Python源码剖析》终于上架了。当年开始剖析Python源码的时候,对于出版,心里只有一个朦朦胧胧的梦想,甚至可以说是幻想,现在幻想成真,回想一下,其间的跌宕也真让人...
  • usr/bin/env python #_*_ coding:utf-8 _*_ import pandas as pd import numpy as np import matplotlib.pyplot as plt #如果一个旅游网站里面有100000个注册用户,以及100个注册酒店,网站有用户通过本网站点击酒店...
  • [Python源码学习]之对象创建与销毁

    万次阅读 2011-09-04 18:35:49
    接前面Python源码笔记之内存管理,尝试看看Python的对象的创建与销毁。 Python的对象类型还挺多,在Python源码笔记之数据类型中试图列一个表出来,最终未果。 不敢贪多,看4个内建对象。 创建对象,也就是创建...
  • 既然要学习python源码,首先我们要在电脑上安装python并且下载python源码,ubuntu 12.04 STL 自带的python版本为2.7.3,这就可以了,接下来下载源码,下载python2.7.7的源代码,下载结束后解压文件,我们会看到...
  • 特别恶心的就是跳转问题,好了,用原生的先试试,后期慢慢熟悉,但是遇到了问题:跳转python源码无法跳转,之前也遇到过,不过使用jedi vim绕过的,不好,今天尝试用其他的解决办法: 从python py源码生成tags文件...
  • [Python源码学习]之模块路径

    千次阅读 2011-09-18 17:34:58
    接前面Python源码笔记之Py_InitializeEx,尝试看看Python中用到的一些Path (这部分东西太乱了...具体见PC/getpathp.c 和 Modules/getpath.c 中的注释)。 一个Python程序要有运行,必须要能找到 .py/.pyc
  • Linux环境Python源码安装命令

    千次阅读 2020-07-03 15:30:18
    mkdir -p /home/datamining/hnq/python361 tar -zxvf Python-3.6.1.tgz cd Python-3.6.1 # 一定要加上--with-ssl ,不然pip 报错 ./configure --prefix=/home/datamining/hnq/python365 --with-ssl make make ...
  • 00、Python源码编译

    千次阅读 2019-10-14 10:28:14
    1、Python-3.7.4源代码 2、VS2015及以上版本, 我们这用VS2017 二、资料获取方式 1、Python-3.7.4获取 首先、进入官网https://www.python.org/, 将鼠标移动到Downloads上; 接下来单机Source code项进入此页面...
  • 快手抖音无水印解析Python源码

    万次阅读 2019-02-20 18:54:26
    这几天心血来潮,带着“三分热度”学习了Python爬虫,在好奇心的驱使下,我扒了两个短视频解析网站的API,通过Python获取返回值并保存到本地,初步实现了快手和抖音的无水印视频解析,并可自定义存放路径,文件名,...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 526,086
精华内容 210,434
关键字:

python源码

python 订阅