1. 程式人生 > >用C語言擴充套件Python介面

用C語言擴充套件Python介面



#假設模組名字是FMBus,並且被儲存為fmbusmodule.c
#include"Python.h"
#include"structmember.h"    //Python\Python36\include  路徑下
#include"object.h"   //Python\Python36\include 路徑下

........
//定義物件
typedef struct {
 PyObject_HEAD

 int fd;  /* open file descriptor: /dev/FMdev1? */
 int addr; /* current address */
 int value; /* address and value pairs*/
 int pec; /* !0 => Packet Error Codes enabled */
} FMBus;

//定義各個回撥函式,用於填充PyTypeObject

static PyObject *FMBus_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
{
 FMBus *self;

 // 1,alloc memory to self;
 // 2,init member value of self-
 self->fd = xx;
 self->addr = 0x10000;
 self->value = 0;

 return (PyObject *)self;
}


static int FMBus_init(FMBus *self, PyObject *args, PyObject *kwds)
{
 int bus = -1;

 static char *kwlist[] = {"bus", NULL};

 if (!PyArg_ParseTupleAndKeywords(args, kwds, "|i:__init__",
   kwlist, &bus))
  return -1;

 if (bus >= 0) {
  FMBus_open(self, args, kwds);
  if (PyErr_Occurred())
   return -1;
 }

 return 0;
}


//定義和填充 PyTypeObject 結構體


static PyTypeObject FMBus_type=
{
 PyVarObject_HEAD_INIT(NULL, 0)
 "FMBus",   /* tp_name */
 sizeof(FMBus),   /* tp_basicsize */
 0,    /* tp_itemsize */
 (destructor)FMBus_dealloc, /* tp_dealloc */
 0,    /* tp_print */
 0,    /* tp_getattr */
 0,    /* tp_setattr */
 0,    /* tp_compare */
 0,    /* tp_repr */
 0,    /* tp_as_number */
 0,    /* tp_as_sequence */
 0,    /* tp_as_mapping */
 0,    /* tp_hash */
 0,    /* tp_call */
 0,    /* tp_str */
 0,    /* tp_getattro */
 0,    /* tp_setattro */
 0,    /* tp_as_buffer */
 Py_TPFLAGS_DEFAULT,  /* tp_flags */
 FMBus_type_doc,   /* tp_doc */
 0,    /* tp_traverse */
 0,    /* tp_clear */
 0,    /* tp_richcompare */
 0,    /* tp_weaklistoffset */
 0,    /* tp_iter */
 0,    /* tp_iternext */
 FMBus_methods,   /* tp_methods */
 0,    /* tp_members */
 FMBus_getset,   /* tp_getset */
 0,    /* tp_base */
 0,    /* tp_dict */
 0,    /* tp_descr_get */
 0,    /* tp_descr_set */
 0,    /* tp_dictoffset */
 (initproc)FMBus_init,  /* tp_init */
 0,    /* tp_alloc */
 FMBus_new,   /* tp_new */
};

//定義和填充 PyMethodDef 結構體
static PyMethodDef FMBus_methods[] = {
 {"open", (PyCFunction)FMBus_open, METH_VARARGS | METH_KEYWORDS,
  FMBus_open_doc},
 {"close", (PyCFunction)FMBus_close, METH_NOARGS,
  FMBus_close_doc},
 {"read_byte", (PyCFunction)FMBus_read_byte, METH_VARARGS,
  SMBus_read_byte_doc},
 {"write_byte", (PyCFunction)FMBus_write_byte, METH_VARARGS,
  SMBus_write_byte_doc}
 
 。。。。。。
 
};
//定義和填充PyModuleDef

static struct PyModuleDef SMBusModule = {
 PyModuleDef_HEAD_INIT,
 "FMBus",   /* m_name */
 FMBus_module_doc,    /* m_doc */
 -1,    /* m_size */
 NULL,    /* m_methods */
 NULL,    /* m_reload */
 NULL,    /* m_traverse */
 NULL,    /* m_clear */
 NULL,    /* m_free */
};


//最後,初始化模組

void PyInit_fmbus(void)
{
 PyObject* m;

 if (PyType_Ready(&FMBus_type) < 0)
  return(NULL);


 m = PyModule_Create(&FMBusModule);

 if (m == NULL)
  return (NULL);

 Py_INCREF(&FMBus_type);
 PyModule_AddObject(m, "FMBus", (PyObject *)&FMBus_type);

 return (m);
}

相關推薦

C語言擴充套件Python介面

 #假設模組名字是FMBus,並且被儲存為fmbusmodule.c #include"Python.h" #include"structmember.h"    //Python\Python36\include  路徑下 #include"object.h"   /

C語言擴充套件Python

最近一直在跟隨《PYTHON核心程式設計》學習一些python的編寫,可惜的是這本書的版本太過於陳舊。大部分範例程式碼都是python2的版本。 剛剛在看python用C語言寫擴充套件包的時候踩到了一個大坑,到現在沒用爬上來 跟其他的python程式碼一樣,擴充套件包也無非就是調包而已,要把python的

C語言擴充套件Python的功能

一、簡介 Python是一門功能強大的高階指令碼語言,它的強大不僅表現在其自身的功能上,而且還表現在其良好的可擴充套件性上,正因如此,Python已經開始受到越來越多人的青睞,並且被屢屢成功地應用於各類大型軟體系統的開發過程中。 與其它普通指令碼語言有所不同,Python程式設計師可以藉助Python語

C語言擴充套件lua模組(入門)

#include <lua.h> #include <lauxlib.h> #include <lualib.h> static void encode_sha(const char* src, char* des) { /* *sha-hash /

C語言呼叫python介面注意事項

1、需要設定python環境路徑 Py_SetPythonHome("C:\\Python27"); 否則初始化Py_Initialize();出錯 2、python的案例當做類似動態庫呼叫,不要有直接執行的程式碼 3、C向python的引數傳遞都是以組元的形式進行的

Python調C語言

word c函數 blog 現在 sum 生成 from str and Python中的ctypes模塊可能是Python調用C方法中最簡單的一種。ctypes模塊提供了和C語言兼容的數據類型和函數來加載dll文件,因此在調用時不需對源文件做任何的修改。也正是如此奠定了這

使用ctypes調c語言接口+使用virtualenv隔離python環境

ffffff pro 計算 virtual ima fly 隔離 語言 text 文章內容為原創,歡迎轉載請註明出處 作者: EflyPro->晦明禪師 文章來源:公眾號“睿江雲計算” 使用ctypes調用c語言接口+使用virtualenv隔離python環境

【資料結構】二叉樹介面的實現(c語言實現)

二叉樹 概念 一棵二叉樹是結點的一個有限集合,該集合或者為空,或者是由一個根節點加上兩棵別稱為左子樹和右子樹的二又樹組成。 二叉樹的特點: 1.每個結點最多有兩棵子樹,即二叉樹不存在度大於2的結點。2.二又樹的子樹有左右之分,其子樹的次序不能顛倒   特殊的二

中國有句俗語叫“三天打魚兩天晒網”。某人從2010年1月1日起開始“三天打魚兩天晒網”,問這個人在以後的某一天中是“打魚”還是“晒網”。CC++語言/java/python實現程式解決問題。

提高要求:1.輸入資料的正確性驗證。           2.使用檔案進行資料測試。如將日期 20100101   20111214  等資料儲存在in.txt檔案中,程式讀入in.dat檔案進行判定,並將結果輸出至out.txt檔案。 import java.io.Bu

Socket介面原理及C#語言實現

首先從原理上解釋一下采用Socket介面的網路通訊,這裡以最常用的C/S模式作為範例,首先,服務端有一個程序(或多個程序)在指定的埠等待客戶來連線,服務程式等待客戶的連線資訊,一旦連線上之後,就可以按設計的資料交換方法和格式進行資料傳輸。客戶端在需要的時刻發出向服務端的連

C語言解決迷宮問題

type out reverse print top stdio.h || 當前位置 坐標 #include <stdio.h> #include <stdlib.h> #define ROW 10 #define COL 10 /*迷宮中位

c語言指針處理字符串

image tdi while clas int color result 處理 std 字符串的處理方法有兩種:一種方法是使用字符數組處理字符串,另一種是方法是使用字符指針處理字符串。 後一種也是c語言比較常用的方法。下面我們來看一個列子: 1 #include<

C語言讀寫數據

cor 數據 and main () term int blog abi //1-5題 #include "stdio.h" typedef struct { char name[10];//姓名 int subject1,subject2,subject3

Linux C語言判斷文件和文件夾

nis ces 文件 char int pat code col exist Linux 用C語言判斷文件和文件夾 #include <stdio.h> #include <stdlib.h> #include <unistd.h> #

c語言產生隨機數的方法

c語言產生隨機數 定義函數 rand 正態分布 time pri 行程 程序 現在 用c語言產生隨機數的方法 一、 //************************************ 偽隨機數 在C語言中,rand()函數可以用來產生隨機數,但是這不是真正意義上的

C語言實現websocket服務器

sockaddr extend ++i set strlen ner ace == perl Websocket Echo Server Demo 背景 嵌入式設備的應用開發大都依靠C語言來完成,我去研究如何用c語言實現websocket服務器也是為了在嵌入式設備中實現一個

樹莓派進階之路 (032) -字符問題(2) - c語言怎樣得到一個漢字的GB2312編碼(轉)

十六進制 字符串 c++ gb2 十進制 轉換 tails 表示 blog C/C++支持的是ASCII,不過漢字編碼中,GB2312與ASCII是兼容的,所以可以在C中獲得漢字的GB2312編碼 GB2312是兩個字節的,第一字節是高八位,第二字節是低八位,比如下面的程序

C語言實現:將三個數按從大到小輸出。

temp clas 實現 ima 編程 程序 c語言實現 從大到小 code 這個題目用編程來實現非常簡單,由於我在上一篇博客中已經介紹過使用“冒泡排序”的方法。 所以我在這裏直接給出使用“冒泡排序”寫出的代碼: #include<stdio.h> int m

C語言實現:將數組A中的內容和數組B中的內容進行交換(數組一樣大)。

image pri 之前 es2017 sys 變量 ret 只需要 題目 之前我們已經完成了對兩個變量內容進行交換的程序,這兩道題目大同小異,不過是將兩數變成了兩數組。 可能我們會想:我們是不是需要第三個數組作為中間變量進行交換操作? 答案是no,我們只需要通過一個循環體

大神幫我做下這個題要C語言不要C++

2.0 大神 b2c 17.1 smd baidu html ++ quest http://baobao.baidu.com/question/9aba706e437305e0b1c98c73af45448e.html?18/Uf=sMDs http://baobao.