精华内容
下载资源
问答
  • Python源码剖析

    2018-04-08 08:31:02
    Python源码剖析Python源码剖析Python源码剖析Python源码剖析Python源码剖析
  • python源码剖析

    2011-05-11 16:18:29
    python源码剖析 python源码剖析 python源码剖析 python源码剖析 python源码剖析 python源码剖析 python源码剖析 python源码剖析 python源码剖析 python源码剖析
  • Python源码

    2018-01-21 00:29:41
    非持续python非持续python非持续python非持续python非持续python非持续python非持续python
  • 利用简单的python类库设计一款五子棋人机对战小游戏,可以在python各版本运行,可视化界面,人机落子采用AI算法。
  • Python源码剖析.pdf

    2019-06-07 12:00:35
    python源码剖析》,学习python源码非常不错的书籍,你值得拥有!
  • 超级玛丽python源码

    2018-10-11 18:02:07
    超级玛丽的python源码,pygame环境配置好后,可直接运行;适合python开发及游戏开发;
  • 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源码剖析书籍源代码免费分享,最低在VS2010上编译运行
  • Python源码保护

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

      由于Python开源的特性,在一些商业场景下,若不想将源码暴露,可通过混淆、编译为pycso(Windows下为pyd)文件等方法起到保护源码的效果。其中,将源码编译为so文件是常用且较好的一种保护方法。

    1 混淆

      代码混淆是将函数、类名和变量名等替换为其他符号,提高了阅读的难度。Oxyry网站提供的在线代码混淆(或使用pyminifier),如下图所示:
    在这里插入图片描述
      代码混淆简单且成本代价低,但由于未改变程序的主体结构,仅降低代码的可读性,实际对源码的保护并不是很好。

    2 pyc

      pyc是Python脚本编译后形成的字节文件。生成后的pyc文件可以直接替换对应的py文件。但需注意Python编译版本与运行版本需要一致。pyc生成并使用流程如下:
      1)通过Python标准库中py_compile(或compileall)或被调用的脚本(如A.py被调用),都将在__pycache__文件夹中生成pyc文件,py_compile使用代码如下:

    import py_compile  
    py_compile.compile(file="xxx.py") # 需转换为pyc文件在——__pycache__中 
    

      2)将pyc文件直接替换对应py文件

      与其他语言相同,pyc也可以通过反编译获取源码。pyc反编译反编译通过uncompyle6,使用如下所示:

    # 安装
    pip install uncompyle6
    # 使用
    uncompyle6 xxx.pyc
    

    在这里插入图片描述

    3 so或pyd

      so(pyd是windows平台)文件是通过cython转换为c后,再进行编译形成的文件。生成so并使用流程如下:

      1)安装cython,Linux平台需安装gcc,Windows平台需安装对应版本的Visual Studio

    pip install cython
    

      2)新建一个build.py文件,内容如下

    from distutils.core import setup
    from Cython.Build import cythonize
    setup(ext_modules = cythonize("xxx.py"))  # xxxe.py是需要转换pyd的py文件
    

      3)在终端下,输入如下命令:

    python build.py build_ext
    

    so文件在目录下的build->lib命名开头文件夹中,如下图so文件在build/lib.macosx-10.7-x86_64-3.6中:

    在这里插入图片描述
      4)将so(或pyd)文件直接替换对应的py文件
      相对混淆和pyc,so(或pyd)对保护效果最好的一种方案。但在使用时,需注意Python版本gcc版本,不一致可能会发生错误。

    展开全文
  • selenium webdriver基于python源码案例,全是案例适合小白入门学习
  • 线性回归做房价预测 python源码
  • python源码剖析笔记1——Python对象初见 工作整两年了,用python最多,然而对于python内部机制不一定都清楚,每天沉醉于增删改查的简单逻辑编写,实在耗神。很多东西不用就忘记了,比如C语言,正好,python源码用C...

    本文简书地址:http://www.jianshu.com/p/763f6cec7a9b

    工作整两年了,用python最多,然而对于python内部机制不一定都清楚,每天沉醉于增删改查的简单逻辑编写,实在耗神。很多东西不用就忘记了,比如C语言,正好,python源码用C写的,分析python源码的同时又能温故C语言基础,实在是件很好的事情。另外,还有陈儒大神的《python源码剖析》做指引,分析也不至于没头没脑。期望在一个月的业余时间,能有所小成,以此为记。

    1 python中的对象

    python中,一切东西都是对象,在c语言实现中对应着结构体。首先当然还是从python内建对象开始看起,最基本的是PyIntObject, PyStringObject, PyListObject, PyDictObject这几个,他们分别属于int,string, list, dict类型。从python2.2之后有了new style class之后,这些内置对象都是继承自object类型,object在代码中对应PyBaseObject_Type。比如我们赋值语句a=3,那么a就是一个PyIntObject对象,它的类型是int,在代码中对应PyInt_Type,PyInt_Type也是一种对象,我们称之为类型对象。那么PyInt_Type它的类型是什么呢,答案是type, 对应到代码中就是PyType_Type。当然object也是一个类型对象,它的类型也是PyType_Type。这么一层层下去,PyType_Type也是个对象,那它的类型又是什么呢,没错,答案就是它的类型就是它自己,。看下面的验证代码:

    ##内建对象测试
    In [1]: a = 3
    
    In [2]: type(a)
    Out[2]: int
    
    In [3]: type(int)
    Out[3]: type
    
    In [4]: type(type)
    Out[4]: type
    
    In [5]: int.__base__
    Out[5]: object
    
    In [6]: type(object)
    Out[6]: type

    先分析下几个基础内建对象在C语言中的结构体以及常用的几个宏,为了方便,我用的也是陈儒大神分析的那个版本一致,版本是2.5.6.源码官网有下载。

    // 内建对象基础
    #define PyObject_HEAD                   \
            Py_ssize_t ob_refcnt;           \
            struct _typeobject *ob_type;
    
    #define PyObject_HEAD_INIT(type)        \
            1, type,
    
    #define PyObject_VAR_HEAD               \
            PyObject_HEAD                   \
            Py_ssize_t ob_size; /* Number of items in variable part */
    #define Py_INVALID_SIZE (Py_ssize_t)-1
    
    typedef struct _object {
            PyObject_HEAD
    } PyObject;
    
    typedef struct {
            PyObject_VAR_HEAD
    } PyVarObject;
    
    typedef struct _typeobject {
            PyObject_VAR_HEAD
            const char *tp_name; /* For printing, in format "<module>.<name>" */
            Py_ssize_t tp_basicsize, tp_itemsize; /* For allocation */
            destructor tp_dealloc;
            printfunc tp_print;
            getattrfunc tp_getattr;
            setattrfunc tp_setattr;
            cmpfunc tp_compare;
            reprfunc tp_repr;
            ...
    } PyTypeObject;
    
    typedef struct {
        PyObject_HEAD
        long ob_ival;
    } PyIntObject;
    
    typedef struct {
        PyObject_VAR_HEAD
        long ob_shash;
        int ob_sstate;
        char ob_sval[1];
        /* Invariants:
         *     ob_sval contains space for 'ob_size+1' elements.
         *     ob_sval[ob_size] == 0.
         *     ob_shash is the hash of the string or -1 if not computed yet.
         *     ob_sstate != 0 iff the string object is in stringobject.c's
         *       'interned' dictionary; in this case the two references
         *       from 'interned' to this object are *not counted* in ob_refcnt.
         */
    } PyStringObject;
    

    如代码中所示,PyObject是所有Python对象的基石,所有后续看到的对象都有一个相同的PyObject头部,从而我们可以在源码中看到所有的对象都可以用PyObject*指针指向,这就是面向对象中经常用到的多态的技巧了。Python内部各个函数对象间也是通过PyObject*传递,即便本身这是一个PyIntObject类型的对象,代码中并不会用PyIntObject*指针进行传递,这也是为了实现多态。比如下面的函数:

    void Print(PyObject* object) {
        object->ob_type->tp_print(object);
    }

    另外如代码中注释所说的,变长对象的ob_size指的是元素个数,不是字节数目。

    2 python对象引用计数

    下面是几个常用的操作对象引用计数的宏定义(object.h),一并列出,这里去除了一些调试时用的代码,更容易看明白代码含义。Py_NewReference是初始化时对象时设置引用计数, Py_INCREF和Py_DECREF分别用来增加引用技术和减少引用计数。从代码中可以看到,python增加引用和减少引用都是通过这些宏操作的,**有一点需要注意的是,当对象引用ob_refcnt减小到0时,会调用对象的析构函数,析构函数并不一定会调用free释放内存空间,因为频繁申请和释放内存严重影响性能,所以在后面看到python有大量用到内存池技术,对提升性能有很大效果。

    需要说明的是,类型对象是不在引用计数规则之中的,每个对象指向类型对象的指针并不视为类型对象的引用,也就是说不会影响类型对象的引用计数,类型对象永远不会被析构。

    #define _Py_NewReference(op) ((op)->ob_refcnt = 1)
    
    
    #define _Py_Dealloc(op) (*(op)->ob_type->tp_dealloc)((PyObject *)(op)))
    
    #define Py_INCREF(op) ((op)->ob_refcnt++)
    
    #define Py_DECREF(op)                                   \
            if (--(op)->ob_refcnt != 0)                     \
                ;
            else                                            \
                _Py_Dealloc((PyObject *)(op))
    
    #define Py_CLEAR(op)                            \
            do {                                    \
                    if (op) {                       \
                            PyObject *tmp = (PyObject *)(op);       \
                            (op) = NULL;            \
                            Py_DECREF(tmp);         \
                    }                               \
            } while (0)
    
    /* Macros to use in case the object pointer may be NULL: */
    #define Py_XINCREF(op) if ((op) == NULL) ; else Py_INCREF(op)
    #define Py_XDECREF(op) if ((op) == NULL) ; else Py_DECREF(op)
    

    3 Python对象分类

    python中的对象大致可以分为下面几类:
    - 数值对象:如integer,float,boolean
    - 序列集合对象:如string,list,tuple
    - 字典对象:如dict
    - 类型对象:如type
    - 内部对象:如后面会看到的code,function,frame,module以及method对象等。

    4 参考资料

    • 《python源码剖析》
    展开全文
  • 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 源码编译安装

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

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

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

    2019-08-10 05:18:48
    本项目致力于对 Python 3.7 的源码分析,深度参考陈儒大大的《Python 源码剖析》,编写 Python 3 的版本。
  • python项目源码

    2018-09-21 10:26:24
    python项目源码
  • LSTM数据集+python源码

    2016-08-04 20:01:43
    LSTM数据集+python源码,实测在Theano环境平台下可用!详情见我的博客:http://blog.csdn.net/zhongkelee/article/details/52090352
  • win7下编译python源码

    千次阅读 2015-08-10 10:58:46
    win7下编译python源码 下载源码: 打开网页:https://www.python.org/downloads/release/python-2710/ 下载完成后解压即可 查看文档: 其实最最可利用的资源是官方的文档,我们进入...
  • 懒人查看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源码剖析笔记3-Python执行原理初探 之前写了几篇源码剖析笔记,然而慢慢觉得没有从一个宏观的角度理解python执行原理的话,从底向上分析未免太容易让人疑惑,不如先从宏观上对python执行原理有了一个基本了解...
  • 抓取CSDN博客文章的简单爬虫python源码
  • python源码大全-python代码大全

    千次阅读 2020-10-30 23:12:50
    例如:想了解python做数据可视化的工作。 我们可以从互联网找一些python做数据可视化的代码进行阅读,调试和迁移。 这样做的好处,突出实用性。 同时,我们在结合联想的学习方法,对所用到的可视化函数,做个更深入...
  • python 新手 练习面向对象的项目 飞机大战 源码+素材
  • python画画源码.py

    2021-01-29 11:48:25
    python画的非常好看的动态图,可以直接python运行源码
  • 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下源码的安装一般由...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 539,116
精华内容 215,646
关键字:

python源码怎么运行

python 订阅