Python與C/C++的混合呼叫
一、問題
Python模組和C/C++的動態庫間相互呼叫在實際的應用中會有所涉及,在此作一總結。
二、Python呼叫C/C++
1、Python呼叫C動態連結庫
Python呼叫C庫比較簡單,不經過任何封裝打包成so,再使用python的ctypes呼叫即可。
(1)C語言檔案:pycall.c
- /***gcc -o libpycall.so -shared -fPIC pycall.c*/
- #include <stdio.h>
- #include <stdlib.h>
-
int foo(int a, int b)
- {
- printf("you input %d and %d\n", a, b);
- return a+b;
- }
(3)Python呼叫動態庫的檔案:pycall.py
- import ctypes
- ll = ctypes.cdll.LoadLibrary
-
lib = ll("./libpycall.so")
- lib.foo(1, 3)
- print '***finish***'
2、Python呼叫C++(類)動態連結庫
需要extern "C"來輔助,也就是說還是隻能呼叫C函式,不能直接呼叫方法,但是能解析C++方法。不是用extern "C",構建後的動態連結庫沒有這些函式的符號表。(1)C++類檔案:pycallclass.cpp
- #include <iostream>
- using namespace std;
- class TestLib
- {
- public:
-
void display();
- void display(int a);
- };
- void TestLib::display() {
- cout<<"First display"<<endl;
- }
- void TestLib::display(int a) {
- cout<<"Second display:"<<a<<endl;
- }
- extern "C" {
- TestLib obj;
- void display() {
- obj.display();
- }
- void display_int() {
- obj.display(2);
- }
- }
(3)Python呼叫動態庫的檔案:pycallclass.py
- import ctypes
- so = ctypes.cdll.LoadLibrary
- lib = so("./libpycallclass.so")
- print 'display()'
- lib.display()
- print 'display(100)'
- lib.display_int(100)
3、Python呼叫C/C++可執行程式
(1)C/C++程式:main.cpp- #include <iostream>
- using namespace std;
- int test()
- {
- int a = 10, b = 5;
- return a+b;
- }
- int main()
- {
- cout<<"---begin---"<<endl;
- int num = test();
- cout<<"num="<<num<<endl;
- cout<<"---end---"<<endl;
- }
(3)Python呼叫程式:main.py
- import commands
- import os
- main = "./testmain"
- if os.path.exists(main):
- rc, out = commands.getstatusoutput(main)
- print 'rc = %d, \nout = %s' % (rc, out)
- print '*'*10
- f = os.popen(main)
- data = f.readlines()
- f.close()
- print data
- print '*'*10
- os.system(main)
4、擴充套件Python(C++為Python編寫擴充套件模組)
所有能被整合或匯入到其它python指令碼的程式碼,都可以被稱為擴充套件。可以用Python來寫擴充套件,也可以用C和C++之類的編譯型的語言來寫擴充套件。Python在設計之初就考慮到要讓模組的匯入機制足夠抽象。抽象到讓使用模組的程式碼無法瞭解到模組的具體實現細節。Python的可擴充套件性具有的優點:方便為語言增加新功能、具有可定製性、程式碼可以實現複用等。為 Python 建立擴充套件需要三個主要的步驟:建立應用程式程式碼、利用樣板來包裝程式碼和編譯與測試。
(1)建立應用程式程式碼
- #include <stdio.h>
- #include <stdlib.h>
- #include <string.h>
- int fac(int n)
- {
- if (n <2) return(1); /* 0! == 1! == 1 */
- return (n)*fac(n-1); /* n! == n*(n-1)! */
- }
- char *reverse(char *s)
- {
- register char t, /* tmp */
- *p = s, /* fwd */
- *q = (s + (strlen(s) - 1)); /* bwd */
- while (p <q) /* if p <q */
- {
- t = *p; /* swap & move ptrs */
- *p++ = *q;
- *q-- = t;
- }
- return(s);
- }
- int main()
- {
- char s[BUFSIZ];
- printf("4! == %d\n", fac(4));
- printf("8! == %d\n", fac(8));
- printf("12! == %d\n", fac(12));
- strcpy(s, "abcdef");
- printf("reversing 'abcdef', we get '%s'\n", \
- reverse(s));
- strcpy(s, "madam");
- printf("reversing 'madam', we get '%s'\n", \
- reverse(s));
- return 0;
- }
(2)用樣板來包裝程式碼
介面的程式碼被稱為“樣板”程式碼,它是應用程式程式碼與Python直譯器之間進行互動所必不可少的一部分。樣板主要分為4步:a、包含Python的標頭檔案;b、為每個模組的每一個函式增加一個型如PyObject* Module_func()的包裝函式;c、為每個模組增加一個型如PyMethodDef ModuleMethods[]的陣列;d、增加模組初始化函式void initModule()。
- #include <stdio.h>
-
相關推薦
python與c++的混合呼叫
最近用c++寫了一個基於Hidden Markov的輸入法,說是輸入法,其實只有兩個功能,一個功能是讀入語料庫,另一個是輸入拼音返回輸出的漢字。寫完了之後,我在想,既然python這麼好用,我又不想重寫一遍輸入法的程式碼,那麼能不能用python呼叫c++現成的
Python與C/C++的混合呼叫
一、問題 Python模組和C/C++的動態庫間相互呼叫在實際的應用中會有所涉及,在此作一總結。 二、Python呼叫C/C++ 1、Python呼叫C動態連結庫 Python呼叫C庫比較簡單,不經過任何封裝打包成so,再使用python的ct
003 Python與類C語言的區別(未完)
特點 .com 裏的 mar dom info pytho alt 溢出 #寫在前面的話:重點記錄Python的特點 Python特點: 1. 無分號斷句 2. 不用擔心溢出問題 3. if-else的用法不同 #if或else後面都要添加冒號
Python與C之間的相互呼叫(Python C API及Python ctypes庫)
分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!http://blog.csdn.net/jiangjunshow 也歡迎大家轉載本篇文章。分享知識,造福人民,實現我們中華民族偉大復興!  
Python與C/C++混合程式設計的應用
我看到的一個很好的Python與C/C++混合程式設計的應用是NS3(Network Simulator3)一款網路模擬軟體,它的內部計算引擎需要用高效能,但在使用者建模部分需要靈活易用。NS3的選擇是使用C/C++來模擬核心部件和協議,用python來建模和擴充套件。 這篇文章介紹Python和C/C++
Python與C混合程式設計!是Python和C都不具備的超能力!
編寫 c => python 的介面檔案 // vectory_py.c extern "C" { vector<point_t>* new_vector(){ return new vector<point_t>
ARM彙編與C語言混合程式設計之彙編呼叫C函式
呼叫沒有引數的函式 呼叫有引數的函式 總結 本文所用硬體平臺為S3C2440開發板。通過一個點亮數碼管的程式說明ARM彙編呼叫C函式的方法。 根據C語言中函式引數的個數,可以將彙編呼叫C函式分為兩種情況,呼叫沒有引數的函式和呼叫有引數的
Python介面(3):Python例項淺談之三Python與C/C++相互呼叫
一、問題 Python模組和C/C++的動態庫間相互呼叫在實際的應用中會有所涉及,在此作一總結。 二、Python呼叫C/C++ 1、Python呼叫C動態連結庫 Python呼叫C庫比較簡單,不經過任何封裝打
python與C/C++相互呼叫
C/C++呼叫python python作為一種膠水語言可以很靈活的嵌入到C++和java等主語言裡面進行互操作實現擴充套件功能。 方法1:使用python提供的C介面(基礎) 使用python提供給C/C++的API,將python程式程式設計文字形式的動態連結庫,可
Matlab與C/C++混合程式設計之Matlab呼叫OpenCV庫函式
研究計算機視覺的同學們對OpenCV和Matlab應該非常熟悉,OpenCV作為最大的計算機視覺開源庫已經得到了非常廣泛的使用,在視覺研究領域的地位不可動搖,其主要是基於C/C++實現的,主要的開發平臺包括VS,Qt等等。Matlab以其在矩陣運算方面獨有的優勢在影象處理領
python與C#的互相呼叫
python與C#的互相呼叫 一、C#呼叫python 新建一個專案,新增引用:IronPython.dll,Microsoft.Scripting.dll(在IronPython的安裝目錄中)。 建立一個文字檔案命名為hello.py,把該檔案新增的當
python與C++的相互呼叫(2)
上文簡單介紹了python,以及在C中進行python模組的匯入、函式、類介面的獲得等比較基本的操作。接下來我們考慮:當我們已經獲得了函式的介面之後,我們就應該能夠對他進行呼叫了,接下來我們就來說一說函式的引數和返回值的問題。上文已經說了在python的世界裡一切都是以P
Python與C++之間的相互呼叫例項3: 在Python中呼叫C++的結構體和類
之前在C++中寫的程式,絕大多數都是用類來封裝的。那麼現在想要在Python中進行呼叫,開始的時候是個頭疼的問題。經過將近一天的摸索學習,大概搞明白了一些。下面貼出來一個例子看一下。首先是C++的結構體和類:#pragma once #include <string&g
Python 與 C/C++ 交互的幾種方式
pythonpython作為一門腳本語言,其好處是語法簡單,很多東西都已經封裝好了,直接拿過來用就行,所以實現同樣一個功能,用Python寫要比用C/C++代碼量會少得多。但是優點也必然也伴隨著缺點(這是肯定的,不然還要其他語言幹嘛),python最被人詬病的一個地方可能就是其運行速度了。這這是大部分腳本語言
[轉]opencv3 圖像處理 之 圖像縮放( python與c++實現 )
space original 註意 libs 波紋 輸出 uil iostream 3.5 轉自:https://www.cnblogs.com/dyufei/p/8205121.html 一. 主要函數介紹 1) 圖像大小變換 cvResize () 原型: void
win下vs用c++與匯編混合編程環境配置
asmwin下vs用c++與匯編混合編程環境配置
Python與C/C++互操作
增加 包裝 eap c程序 得到 二進制 說明 數據 and Python調用C/C++ Python調用C/C++的方法可以分為兩類: 手寫擴展模塊:除了被調用的C/C++函數外,一般還需要編寫包裹函數、導出表、導出函數、編譯腳本等代碼。 使用封裝庫的接口:比如官方的c
python與C,在寫程序時踩過的坑!
dex 自動 臨時 字符串 ict 不同 size 初始化 存儲 1. python與C有很多相似之處, 其一就是指針的大量應用, 因此在使用臨時變量保存數據, 並將臨時變量傳遞給其他變量時需要創建內存; 例如,在C中, char *temp 每次獲取到不同的
資料結構與演算法 二分法查詢【Python與C】的實現
程式碼如下: Python: def ErFen(List ,Number ,Len): left = 0 high = Len - 1 while left <= high: mid = (left + high)//2
彙編函式與c函式互相呼叫問題
彙編函式與c函式的互相呼叫問題 從函式定義的角度來看,彙編函式與c函式都是執行流的基本單位,兩者沒有太大的區別。從操作物件來看,彙編函式中的指令都是直接操作暫存器完成的,c函式中的語句是通過操作變數(可能在暫存器中,大部分時間中都在記憶體中例如ram、cache)。 從c函式調用