C++開發(fā)python windows版本的擴(kuò)展模塊示例
測試環(huán)境介紹和準(zhǔn)備
測試環(huán)境:
操作系統(tǒng):windows10
Python版本:3.7.0
VS版本:vs2015社區(qū)版(免費(fèi))
相關(guān)工具下載:
VS版本vs2015社區(qū)版(免費(fèi))
win10SDK(安裝vs2015是可以選擇,如果沒有安裝則需要獨(dú)立安裝)
Python3.7.0 win32 安裝文件
http://ffmpeg.club/python
本示例不使用vs來編輯,但需要安裝vs的編譯環(huán)境,直接用python的distutils進(jìn)行編譯安裝,注意這里安裝的python是32位的,所以編譯出來庫也是32位程序。
首先要檢測系統(tǒng)中是否有其他python版本,防止沖突
進(jìn)入python命令行
import sys
print(sys.path)
創(chuàng)新互聯(lián)是專業(yè)的惠州網(wǎng)站建設(shè)公司,惠州接單;提供成都網(wǎng)站設(shè)計(jì)、網(wǎng)站建設(shè),網(wǎng)頁設(shè)計(jì),網(wǎng)站設(shè)計(jì),建網(wǎng)站,PHP網(wǎng)站建設(shè)等專業(yè)做網(wǎng)站服務(wù);采用PHP框架,可快速的進(jìn)行惠州網(wǎng)站開發(fā)網(wǎng)頁制作和功能擴(kuò)展;專業(yè)做搜索引擎喜愛的網(wǎng)站,專業(yè)的做網(wǎng)站團(tuán)隊(duì),希望更多企業(yè)前來合作!
查看下當(dāng)前系統(tǒng)路徑是否正確,如果是其他路徑的版本,可能會對的擴(kuò)展庫開發(fā)產(chǎn)生影響。主要是庫文件、頭文件、dll文件不一致的問題。
1 頭文件和庫文件
首先創(chuàng)建文件 mymod.c 在文件中添加頭文件引用
頭文件引用 #include "Python.h",庫文件不需要指定,頭文件路徑在python的安裝路徑。
2 定義模塊函數(shù)
其中函數(shù)參數(shù) self是模塊自身,args是python傳遞的參數(shù)列表,返回值定義了一個×××數(shù)0,這里會申請空間增加引用計(jì)數(shù),交由python來管理這個引用。這里也可以返回NULL,python會收到一個異常。
#include "Python.h"
///模塊函數(shù)
static PyObject *testmod(PyObject *self,PyObject*args)
{
//返回python的long×××,c語言中引用計(jì)數(shù)+1,返回值交由python釋放
return PyLong_FromLong(0);
}
3 申明模塊函數(shù)(開放給python)
第一個函數(shù)名稱,就是開放給python的名稱,不一定要與c語言的函數(shù)名稱一致,但還是盡量一致,方便跟進(jìn)代碼;
第二個是函數(shù)指針,默認(rèn)類型就是PyCFunction函數(shù)指針類型,也就是上面的函數(shù)類型;
第三個參數(shù)是開放給python的函數(shù)參數(shù)類型,這里我們設(shè)置的無參數(shù)METH_NOARGS,還可以設(shè)置METH_VARARGS 多個參數(shù),METH_KEYWORDS key value參數(shù),設(shè)置為METH_KEYWORDS必須與METH_VARARGS一起設(shè)置 METH_KEYWORDS|METH_VARARGS ,并且模塊函數(shù)會增加一個參數(shù)存放傳進(jìn)來的參數(shù)字典;
第四個參數(shù)是函數(shù)說明,在python中調(diào)用help函數(shù)可以讀?。?br/>這個定義是一個數(shù)據(jù),可以設(shè)置多個函數(shù)PyMethodDef定義對象
/// 模塊函數(shù)列表
static PyMethodDef mymod_funcs[] = {
{
"testmod", //函數(shù)名稱
testmod, //函數(shù)指針
METH_NOARGS,//參數(shù)標(biāo)識 無參數(shù),
"testmod function." //函數(shù)說明 help(testmod)
},
{0,0,0,0} //數(shù)組結(jié)尾,可以申請多個函數(shù)
};
4 模塊定義
///4 模塊定義
static PyModuleDef mymod_module = {
PyModuleDef_HEAD_INIT,
"mymod", //模塊名
"mymod is first module test", //模塊說明 通過help(模塊名)
-1, //模塊空間,子解釋器用,-1不使用
mymod_funcs //模塊函數(shù),前面定義的函數(shù)申明數(shù)組
};
5 添加入口函數(shù)
其中PyMODINIT_FUNC 宏在windows中是
PyMODINIT_FUNC declspec(dllexport) PyObject*,
也就是入口的動態(tài)鏈接庫函數(shù),不同于ctypes庫,擴(kuò)展庫只有入口函數(shù)需要定義declspec(dllexport)導(dǎo)出函數(shù)符號,其他的函數(shù)不需要。
PyModuleCreate創(chuàng)建python的模塊,參數(shù)是前面定義的模塊,返回直接返回模塊對象,在python中所有類型都可以轉(zhuǎn)為PyObject
///1 擴(kuò)展庫入口函數(shù) PyInit 固定的開頭 mymod模塊名
PyMODINIT_FUNC PyInit_mymod(void)
{
printf("PyInit_mymod\n");
///2 模塊創(chuàng)建函數(shù) 參數(shù) PyModuleDef
return PyModule_Create(&mymod_module);
}
6 編譯安裝
創(chuàng)建一個文件setup.py
第一行代碼導(dǎo)入setup庫,其中name是打包的庫說明的.egg-info的文件名
version=“1.0” 這個說明文件名的后綴,如果不設(shè)置后綴會默認(rèn)0.0.0
ext_modules=[Extension("mymod", ["mymod.c"] )] 中mymode是對應(yīng)的模塊名稱和模塊文件名,["mymod.c"]里面是編譯為庫的源文件,可以是多個文件,這里是一個python的list數(shù)組。
from distutils.core import *
setup(
name="mymod", #打包文件名稱 庫說明文件的文件名
version="1.0",
ext_modules=[Extension("mymod", ["mymod.c"] )]
)
最后運(yùn)行命令 python setup.py install
編譯成功,在當(dāng)前路徑下會生成一個build目錄,里面是編譯好的內(nèi)容,應(yīng)為運(yùn)行了install命令,所以不僅做了編譯還有安裝。
擴(kuò)展庫安裝的路徑:F:\Python-3.7.0\Lib\site-packages
7 擴(kuò)展庫調(diào)用測試
擴(kuò)展庫編譯和按照好后我們寫一個python代碼來測試
這樣我們就完成了我們第一個python擴(kuò)展庫的程序
http://edu.51cto.com/course/15278.html
當(dāng)前文章:C++開發(fā)pythonwindows版本的擴(kuò)展模塊示例
本文地址:http://jinyejixie.com/article34/ijjdpe.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供動態(tài)網(wǎng)站、網(wǎng)站建設(shè)、定制開發(fā)、App設(shè)計(jì)、網(wǎng)站策劃、微信公眾號
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)