zoukankan      html  css  js  c++  java
  • C扩展Python

    1. Code & Official_doc: THIS

    2. My question. 

    #include <Python.h>                                                                                                                          
    
    /* 
     * 1.PyTypeObject doc, md, 我看了快两天才明白。我是白痴吗?
     * 这里定义了一个结构体,也就是定义了一个c的类型,名叫 kevin_KevinType.
     * 2. 回忆一下 c中static, THIS, THIS.
     */
    staticforward PyTypeObject kevin_KevinType;
    
    // every Python object contains - a refcount and a pointer to a type object. 
    typedef struct {
        PyObject_HEAD
    } kevin_KevinObject;
    
    /*
     * 返回值类型: PyObject
     * 完全是因为, kevin_KevinObject类型 就仅仅是 PyObject
     * 如果要是自己定义了一个复杂的类型 kevin_complicatedObject
     * 那返回值类型 应该是 kevin_complicatedObject
     * 构造函数
     */
    static PyObject*
    kevin_new_kevin(PyObject *self, PyObject *args) {
       // 定义变量(这还要你废话!?哦O.O) 
      kevin_KevinObject* kevin;
    
        /*
         * 没有存在感。我把它删了。
        if(!PyArg_ParseTuple(args, ":new_kevin")) {
            return NULL;
        }
        */
    
      //  allocates the memory and then initializes the object
        kevin = PyObject_New(kevin_KevinObject, &kevin_KevinType);
      // 看,ta强制转换了。原因,不解释。
        return (PyObject*)kevin;
    }
    
    // 析构
    static void
    kevin_kevin_dealloc(PyObject* self) {
        PyObject_Del(self);
    }
    
    // doc doc
    // PyObject_HEAD_INIT(a.ctrl+F; b.THIS; )
    static PyTypeObject kevin_KevinType = { PyObject_HEAD_INIT(NULL) 0, "Kevin", sizeof(kevin_KevinObject), 0, kevin_kevin_dealloc, /*tp_dealloc*/ 0, /*tp_print*/ 0, /*tp_getattr*/ 0, /*tp_setattr*/ 0, /*tp_compare*/ 0, /*tp_repr*/ }; static PyMethodDef kevin_methods[] = {   {"new_kevin", kevin_new_kevin, METH_VARARGS,     "Create a new Kevin object."},   {NULL, NULL, 0, NULL} }; DL_EXPORT(void) initkevin(void) {   kevin_KevinType.ob_type = &PyType_Type;
      // doc   Py_InitModule(
    "kevin", kevin_methods); }

    执行。注意,命令的输出是否有错,如果是写文件什么的,sudo,以管理员权限执行:

    $ python setup.py build

    再执行。如果是ubuntu,应该是有权限问题,sudo

    $ sudo python setup.py install

    玩玩。

    >>> # 是Py_InitModule(name, ...), name的影响,,所以module name是kevin
    >>> # Py_InitModule:doc
    >>> # 与 distutils Extension(name, ...), name影响了的区别呢?
    >>> # THIS, 前面那个文档或许解释了两者的区别。
    >>> #
    Py_InitModule(name, ...), name 能控制 module_name。
    >>> # 而 distutils Extension(name, ...), name能控制目录结构,也就是 import的结构。
    >>> # 两个name名字要相同,否则会:
    >>> import kevin
    Traceback (most recent call last):
    File "<stdin>", line 1, in <module>
    SystemError: dynamic module not initialized properly
    >>> # 相关文档: Package, buildWithDistutils, class distutils.core.Extension, 详细:distutils
    >>> import kevin
    >>> kevin.new_kevin()
    <Kevin object at 0xb73614d8>
    >>> # 上面的输出kevin,是 static PyTypeObject kevin_KevinType={}的影响

      

  • 相关阅读:
    [题解]luogu_P4198_楼房重建(线段树logn合并
    [题解]luogu_P3084(单调队列dp
    [题解]luogu_P3084(差分约束/梦想spfa
    [题解/模板]POJ_1201(差分约束
    [题解]luogu_P5059(矩乘
    [题解]luogu_P5004跳房子2(矩乘递推
    CF1042A Benches(二分答案)
    8.24考试总结
    NOIP2017题目
    「LG3045」「USACO12FEB」牛券Cow Coupons
  • 原文地址:https://www.cnblogs.com/kevin922/p/3204460.html
Copyright © 2011-2022 走看看