摘要:調用方式方式一基礎篇這種方法叫做的擴展使用這樣調用引用的頭文件包裹函數,用來包裹需要轉化為的函數,在方法前面加下劃線。定義名稱通常和文件名保持一致。執行命令在下,使用編譯器生成對應的文件。
Python調用C++方式 方式一(基礎篇)
這種方法叫做python的擴展
int great_function(int a) { return a + 1; }
使用python這樣調用
>>> from great_module import great_function >>> great_function(2) 3
// great_module.c // 引用python的頭文件 #includeint great_function(int a) { return a + 1; } // 包裹函數,用來包裹需要轉化為python的函數,在方法前面加下劃線。 static PyObject * _great_function(PyObject *self, PyObject *args) { int _a; int res; // 檢查參數類型是否正確,python參數轉化為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命令行參數:
-shared
生成一個共享對象,可以與其他對象接連成可執行文件
-fPIC
適用于動態鏈接,避免全局偏移表大小的限制,只能在某些機器上運行
在當前目錄下得到great_module.so,同理可以在Python中直接使用。
方法二(使用SWIG)SWIG : Simplified Wrapper and Interface Generator調用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名稱通常和文件名保持一致。
%{%}包裹的部分是c語言代碼,這段代碼會原封不動的復制到mymodule_wrap.c
欲導出的函數簽名列表。直接從頭文件中復制過來即可
$ swig -c++ -python great_module.i
會生成對應的great_module_wrap.c和great_module.py文件
再執行:
$ g++ -fPIC -shared great_class_wrap.cxx -o _great_class.so -I/usr/include/python2.7/ -lpython2.7
生成對應的_great_module.so文件,這時,我們就可以再python中直接調用了
from great_module import great_function print great_function(9) >>> 10調用c++
定義一個頭文件,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
再定義一個great_class.i的swig配置文件,這里不用再寫一遍SWIG的定義了,直接使用SWIG的%include指令;
在SWIG編譯時要加-c++這個選項,生成的擴展名為cxx。
/* great_class.h */ %module great_class %{ #include "great_class.h" %} %include "great_class.h"
執行命令:
$ 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
生成對應的_great_class.so文件。現在可以直接在python中輸入
import great_class c = great_class.Great() c.setWall(10) print c.getWall() >>> 10參考
知乎作者:Jerry Jho 鏈接
SWIG的官方文檔SWIG Users Manual
GCC命令行選項
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://m.specialneedsforspecialkids.com/yun/41194.html
摘要:調用以回調函數地址為參數的函數這個主題就稍微繞一些了,也就是說在接口中,需要傳入回調函數作為參數。這個問題在中也可以解決,并且回調函數可以用定義。代碼代碼很簡單回調函數的傳入參數為,返回參數也是。 項目中要對一個用 C 編寫的 .so 庫進行邏輯自測。這項工作,考慮到靈活性,我首先考慮用 Python 來完成。 研究了一些資料,采用 python 的 ctypes 來完成這項工作。已經...
摘要:可以在接口文件中直接引用庫里的內容,大大方便接口文件的編寫。使用庫里的這里先介紹方式通過創建出來的數組是數組的直接代理,非常底層和高效,但是,它也和數組一樣不安全,一樣沒有邊界檢查。對由于這種情況,可以使用庫里的。 如果你也像我們一樣,同時使用Python和C++,以獲得兩種語言的優勢,一定也會希望尋找一種好的方式集成這兩種語言,相比而言,讓Python能夠方便使用C++的庫更加重要,...
摘要:整個過程還是比較清晰的,關鍵是要理解的工作方式,而不是想當然地認為調用了父類的方法。小結事實上,和父類沒有實質性的關聯。 super() 的入門使用 在類的繼承中,如果重定義某個方法,該方法會覆蓋父類的同名方法,但有時,我們希望能同時實現父類的功能,這時,我們就需要調用父類的方法了,可通過使用 super 來實現,比如: class Animal(object): def __...
摘要:因為你可能需要在工作中與一些奇怪的人合作問題多線程使用。回答不允許真正意義上的多線程。在學習之前,很多人花了很多的時間在他們的多線程中遇到了瓶頸。 showImg(https://segmentfault.com/img/remote/1460000019609267); 介紹 隨著人工智能、機器學習、深度學習的發展,這個領域也正在不斷的進入人們的眼簾,并且帶來了很多、很大的工作機會,...
摘要:使用抽象基類顯示表示接口如果類的作用是定義接口,應該將其明確定義為抽象基類。此外,抽象基類可以作為其他類的唯一基類,混入類則決不能作為唯一的基類,除非這個混入類繼承了另一個更具體的混入這種做法非常少見。 《流暢的Python》筆記本篇是面向對象慣用方法的第五篇,我們將繼續討論繼承,重點說明兩個方面:繼承內置類型時的問題以及多重繼承。概念比較多,較為枯燥。 1. 繼承內置類型 內置類型...
閱讀 3163·2021-11-22 14:45
閱讀 3313·2019-08-29 13:11
閱讀 2315·2019-08-29 12:31
閱讀 934·2019-08-29 11:21
閱讀 3000·2019-08-29 11:09
閱讀 3628·2019-08-28 18:11
閱讀 1432·2019-08-26 13:58
閱讀 1283·2019-08-26 13:27