摘要:調(diào)用方式方式一基礎(chǔ)篇這種方法叫做的擴(kuò)展使用這樣調(diào)用引用的頭文件包裹函數(shù),用來(lái)包裹需要轉(zhuǎn)化為的函數(shù),在方法前面加下劃線。定義名稱(chēng)通常和文件名保持一致。執(zhí)行命令在下,使用編譯器生成對(duì)應(yīng)的文件。
Python調(diào)用C++方式 方式一(基礎(chǔ)篇)
這種方法叫做python的擴(kuò)展
int great_function(int a) { return a + 1; }
使用python這樣調(diào)用
>>> from great_module import great_function >>> great_function(2) 3
// great_module.c // 引用python的頭文件 #includeint great_function(int a) { return a + 1; } // 包裹函數(shù),用來(lái)包裹需要轉(zhuǎn)化為python的函數(shù),在方法前面加下劃線。 static PyObject * _great_function(PyObject *self, PyObject *args) { int _a; int res; // 檢查參數(shù)類(lèi)型是否正確,python參數(shù)轉(zhuǎn)化為c if (!PyArg_ParseTuple(args, "i", &_a)) return NULL; res = great_function(_a); return PyLong_FromLong(res); } // 定義的方法表,用于在python中查找 static PyMethodDef GreateModuleMethods[] = { { "great_function", _great_function, METH_VARARGS, "" }, {NULL, NULL, 0, NULL} }; // 必須以module名前面加init定義該方法 PyMODINIT_FUNC initgreat_module(void) { (void) Py_InitModule("great_module", GreateModuleMethods); }
在Linux下面,則用gcc編譯:
$ gcc -fPIC -shared great_module.c -o great_module.so -I/usr/include/python2.7/ -lpython2.7
gcc命令行參數(shù):
-shared
生成一個(gè)共享對(duì)象,可以與其他對(duì)象接連成可執(zhí)行文件
-fPIC
適用于動(dòng)態(tài)鏈接,避免全局偏移表大小的限制,只能在某些機(jī)器上運(yùn)行
在當(dāng)前目錄下得到great_module.so,同理可以在Python中直接使用。
方法二(使用SWIG)SWIG : Simplified Wrapper and Interface Generator調(diào)用c
不僅可以用于python,也可以用于其他java/perl/ruby/php/JavaScript/Go。
/* great_module.i */ %module great_module %{ int great_function(int a) { return a + 1; } %} int great_function(int a);
定義module名稱(chēng)通常和文件名保持一致。
%{%}包裹的部分是c語(yǔ)言代碼,這段代碼會(huì)原封不動(dòng)的復(fù)制到mymodule_wrap.c
欲導(dǎo)出的函數(shù)簽名列表。直接從頭文件中復(fù)制過(guò)來(lái)即可
$ swig -c++ -python great_module.i
會(huì)生成對(duì)應(yīng)的great_module_wrap.c和great_module.py文件
再執(zhí)行:
$ g++ -fPIC -shared great_class_wrap.cxx -o _great_class.so -I/usr/include/python2.7/ -lpython2.7
生成對(duì)應(yīng)的_great_module.so文件,這時(shí),我們就可以再python中直接調(diào)用了
from great_module import great_function print great_function(9) >>> 10調(diào)用c++
定義一個(gè)頭文件,great_class.h
#ifndef GREAT_CLASS #define GREAT_CLASS class Great { private: int s; public: void setWall (int _s) {s = _s;}; int getWall() {return s;}; }; #endif
再定義一個(gè)great_class.i的swig配置文件,這里不用再寫(xiě)一遍SWIG的定義了,直接使用SWIG的%include指令;
在SWIG編譯時(shí)要加-c++這個(gè)選項(xiàng),生成的擴(kuò)展名為cxx。
/* great_class.h */ %module great_class %{ #include "great_class.h" %} %include "great_class.h"
執(zhí)行命令:
$ swig -c++ -python great_class.i
在Linux下,使用C++編譯器g++
g++ -fPIC -shared great_class_wrap.cxx -o _great_class.so -I/usr/include/python2.7/ -lpython2.7
生成對(duì)應(yīng)的_great_class.so文件。現(xiàn)在可以直接在python中輸入
import great_class c = great_class.Great() c.setWall(10) print c.getWall() >>> 10參考
知乎作者:Jerry Jho 鏈接
SWIG的官方文檔SWIG Users Manual
GCC命令行選項(xiàng)
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://specialneedsforspecialkids.com/yun/41194.html
摘要:調(diào)用以回調(diào)函數(shù)地址為參數(shù)的函數(shù)這個(gè)主題就稍微繞一些了,也就是說(shuō)在接口中,需要傳入回調(diào)函數(shù)作為參數(shù)。這個(gè)問(wèn)題在中也可以解決,并且回調(diào)函數(shù)可以用定義。代碼代碼很簡(jiǎn)單回調(diào)函數(shù)的傳入?yún)?shù)為,返回參數(shù)也是。 項(xiàng)目中要對(duì)一個(gè)用 C 編寫(xiě)的 .so 庫(kù)進(jìn)行邏輯自測(cè)。這項(xiàng)工作,考慮到靈活性,我首先考慮用 Python 來(lái)完成。 研究了一些資料,采用 python 的 ctypes 來(lái)完成這項(xiàng)工作。已經(jīng)...
摘要:可以在接口文件中直接引用庫(kù)里的內(nèi)容,大大方便接口文件的編寫(xiě)。使用庫(kù)里的這里先介紹方式通過(guò)創(chuàng)建出來(lái)的數(shù)組是數(shù)組的直接代理,非常底層和高效,但是,它也和數(shù)組一樣不安全,一樣沒(méi)有邊界檢查。對(duì)由于這種情況,可以使用庫(kù)里的。 如果你也像我們一樣,同時(shí)使用Python和C++,以獲得兩種語(yǔ)言的優(yōu)勢(shì),一定也會(huì)希望尋找一種好的方式集成這兩種語(yǔ)言,相比而言,讓Python能夠方便使用C++的庫(kù)更加重要,...
摘要:整個(gè)過(guò)程還是比較清晰的,關(guān)鍵是要理解的工作方式,而不是想當(dāng)然地認(rèn)為調(diào)用了父類(lèi)的方法。小結(jié)事實(shí)上,和父類(lèi)沒(méi)有實(shí)質(zhì)性的關(guān)聯(lián)。 super() 的入門(mén)使用 在類(lèi)的繼承中,如果重定義某個(gè)方法,該方法會(huì)覆蓋父類(lèi)的同名方法,但有時(shí),我們希望能同時(shí)實(shí)現(xiàn)父類(lèi)的功能,這時(shí),我們就需要調(diào)用父類(lèi)的方法了,可通過(guò)使用 super 來(lái)實(shí)現(xiàn),比如: class Animal(object): def __...
摘要:因?yàn)槟憧赡苄枰诠ぷ髦信c一些奇怪的人合作問(wèn)題多線程使用。回答不允許真正意義上的多線程。在學(xué)習(xí)之前,很多人花了很多的時(shí)間在他們的多線程中遇到了瓶頸。 showImg(https://segmentfault.com/img/remote/1460000019609267); 介紹 隨著人工智能、機(jī)器學(xué)習(xí)、深度學(xué)習(xí)的發(fā)展,這個(gè)領(lǐng)域也正在不斷的進(jìn)入人們的眼簾,并且?guī)?lái)了很多、很大的工作機(jī)會(huì),...
摘要:使用抽象基類(lèi)顯示表示接口如果類(lèi)的作用是定義接口,應(yīng)該將其明確定義為抽象基類(lèi)。此外,抽象基類(lèi)可以作為其他類(lèi)的唯一基類(lèi),混入類(lèi)則決不能作為唯一的基類(lèi),除非這個(gè)混入類(lèi)繼承了另一個(gè)更具體的混入這種做法非常少見(jiàn)。 《流暢的Python》筆記本篇是面向?qū)ο髴T用方法的第五篇,我們將繼續(xù)討論繼承,重點(diǎn)說(shuō)明兩個(gè)方面:繼承內(nèi)置類(lèi)型時(shí)的問(wèn)題以及多重繼承。概念比較多,較為枯燥。 1. 繼承內(nèi)置類(lèi)型 內(nèi)置類(lèi)型...
閱讀 3153·2021-11-22 14:45
閱讀 3299·2019-08-29 13:11
閱讀 2305·2019-08-29 12:31
閱讀 921·2019-08-29 11:21
閱讀 2990·2019-08-29 11:09
閱讀 3615·2019-08-28 18:11
閱讀 1419·2019-08-26 13:58
閱讀 1272·2019-08-26 13:27