日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > python >内容正文

python

如何使用C来扩展python功能。

發布時間:2025/3/15 python 26 豆豆
生活随笔 收集整理的這篇文章主要介紹了 如何使用C来扩展python功能。 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
本文檔和所包含程序為MIT授權

我們來實現一個簡單的加法的擴展模塊!
建立一個目錄,整個目錄名中不要包含中文。在目錄下建立
add.c,內容如下:
  • #include <Python.h>;

  • static PyObject* add(PyObject *self, PyObject *args);
  • //一定聲明為static,把他們限制在這個文件范圍里。 幾乎所有的參數都是PyObject類型。 在python,每個東西都是object。

  • static PyObject* add(PyObject* self, PyObject* args)
  • {
  • ? ?int x=0 ;
  • ? ?int y=0;
  • ? ?int z=0;
  • ? ? ? ? if (! PyArg_ParseTuple(args, "i|i", &x, &y))
  • ? ? ? ? ? ? ? ? return NULL;
  • ? ? ? ? /*第一個參數是self,這個是python用的, 每個函數都要有。我們暫時不管。args是一個參數列表。她把所有的參數都整合成一個string。所以
  • ? ? ? ? 我們需要從這個string里來解析我們的參數。PyArg_ParseTuple來完成這個任務。第一個參數是args, 就是我們要轉換的參數。第二個是格式符號。
  • ? ? ? ? “s”代表是個string。 從args里提取一個參數就寫"s", 兩個的話就寫"s|s", 如果是一個string,一個int,就寫"s|i", 和printf差不多。第三個
  • ? ? ? ? 參數就是提取出來的參數放置的真正位置。必須傳遞這個參數的地址。對于add, 他將提取兩個參數。分別是x和y。*/
  • z=x+y;
  • return Py_BuildValue("i", z);
  • ? ? /*調用完之后我們需要返回結果。這個結果是c的type或者是我們自己定義的類型。必須把他轉換成PyObject, 讓python認識。這個用Py_BuildValue
  • ? ? ? ? 來完成。他是PyArg_ParseTuple的逆過程。他的第一個參數和PyArg_ParseTuple的第二個參數一樣, 是個格式化符號。第三個參數
  • ? ? ? ? 是我們需要轉換的參數。Py_BuildValue會把所有的返回只組裝成一個tutple給python。*/
  • }

  • static PyMethodDef addMethods[] =
  • {
  • ? ?{"add",??add, METH_VARARGS, "Execute a shell command."},
  • ? ?{NULL, NULL, 0, NULL}
  • };
  • /*這個是一個c的結構。他來完成一個映射。 我們需要把我們擴展的函數都映射到這個表里。表的第一個字段是python真正認識的。是python
  • 里的方法名字。 第二個字段是python里的這個方法名字的具體實現的函數名。 在python里調用add, 真正執行的是用c寫的add函數。
  • 第三個字段是METH_VARARGS, 他告訴python,add是調用c函數來實現的。第四個字段是這個函數的說明。如果你在python里來help這個函數,
  • 將顯示這個說明。相當于在python里的函數的文檔說明。*/

  • PyMODINIT_FUNC initadd()
  • {
  • ? ?? ? Py_InitModule("add", addMethods);
  • }
  • /*注意,這個函數的名字不能改動。 必須是init+模塊名字。 我們的模塊名字是add。所以這個函數是initadd()。
  • 這樣python在導入add 的模塊時候,才會找到這個函數,并調用。這個函數調用Py_InitModule來將模塊名字和映射表結合在一起。
  • 他表示,add這個模塊使用addMethods這個映射表。python應該這樣導入我們的module的.*/
  • 復制代碼
    然后建立setup.py這個文件,內容如下:
  • #! /usr/bin/python

  • from distutils.core import setup, Extension

  • module1 = Extension('add', sources = ['add.c'])

  • setup (name = 'PackageName', version = '1.0', description = 'This is a demo package', ext_modules = [module1])
  • 復制代碼
    在msdos下進入這個目錄,輸入命令setup.py build。
    如果你能編譯成功,到你所在目錄的build\lib.win32-2.3下會發現add.pyd文件,將文件復制到你所需要的地方,啟動python,然后:
  • D:\c>;python
  • Python 2.3.3 (#51, Dec 18 2003, 20:22:39) [MSC v.1200 32 bit (Intel)] on win32
  • Type "help", "copyright", "credits" or "license" for more information.
  • >;>;>; import add
  • >;>;>; print dir(add)
  • ['__doc__', '__file__', '__name__', 'add']
  • >;>;>; add.add(1,2)
  • 3
  • >;>;>;
  • 復制代碼

    總結

    以上是生活随笔為你收集整理的如何使用C来扩展python功能。的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

    主站蜘蛛池模板: 无码人妻aⅴ一区二区三区日本 | 亚洲石原莉奈一区二区在线观看 | 亚洲 欧美 日韩 国产综合 在线 | 亚洲天堂成人在线 | 影音先锋黄色资源 | 91新视频| 欧美高清免费 | 国产真实的和子乱拍在线观看 | 色哟哟国产精品 | 在线播放国产一区 | 中国久久 | 欧美aⅴ视频| 啪啪免费av | 老外毛片 | 激情国产一区 | 抖音视频在线观看 | 18禁免费观看网站 | 性色欲情网站iwww九文堂 | 国产精品成人免费精品自在线观看 | 亚洲欧美日韩免费 | 69av网 | 日本xxxx色| 毛片一级在线观看 | 人人爱爱 | 午夜国产福利在线 | 风间由美在线观看 | 国产成人精品视频ⅴa片软件竹菊 | 男人插入女人下面视频 | 日韩久久影院 | 日韩人妻精品一区二区三区 | 可以在线观看的黄色 | 99久久九九 | www.插插插| 91精品在线观看视频 | 国产无遮挡免费观看视频网站 | 日韩精品一区二区av | 91免费在线 | 欧美一级二级视频 | 成人二三区 | 欧美成人xxxx | 国产性自拍 | 一级黄色片在线 | 欧美激情在线播放 | 中文字幕黄色av | 高清一区二区在线 | 欧美 日韩 中文 | 一起操网站 | 久久天天综合 | 无码人妻精品一区二区蜜桃视频 | 国产熟妇一区二区三区四区 | av青青 | 久久久久亚洲av无码专区 | 香蕉av一区二区 | 视频在线不卡 | 一区二区激情 | 91精彩刺激对白 | 亚洲一区二区影视 | 美女免费黄视频 | 嫩草视频在线播放 | 综合在线观看 | 日日爱夜夜操 | 男人操女人的网站 | 一级全黄男女免费大片 | 日b视频在线观看 | 三上悠亚ssⅰn939无码播放 | 成人日韩欧美 | 色射视频 | 131美女爱做视频 | 日韩在线播放一区 | 男受被做哭激烈娇喘gv视频 | 久久综合伊人77777蜜臀 | 亚洲国产精品免费 | 被灌满精子的波多野结衣 | 三级国产网站 | 亚洲dvd | 黄色网www | 全程粗话对白视频videos | 九色精品视频 | 一区二区三区在线免费视频 | jizz成熟丰满老女人 | 欧美男同又粗又长又大 | 男人把女人捅爽 | 欧美日韩一区电影 | 秋霞午夜鲁丝一区二区老狼 | 久久韩日 | 色999在线| 欧美中文字幕视频 | 亚洲一级二级片 | 日本真人做爰免费视频120秒 | se综合| 色婷婷国产精品综合在线观看 | 亚洲精品性 | 久草a视频| 大桥未久av在线 | www黄色网址| 日本免费一区二区三区最新 | av字幕网| 久久精品无码中文字幕 | 日本黄色美女网站 |