1. 程式人生 > >Python與C/C++的混合呼叫

Python與C/C++的混合呼叫

一、問題

     Python模組和C/C++的動態庫間相互呼叫在實際的應用中會有所涉及,在此作一總結。

二、Python呼叫C/C++

1、Python呼叫C動態連結庫

        Python呼叫C庫比較簡單,不經過任何封裝打包成so,再使用python的ctypes呼叫即可。
(1)C語言檔案:pycall.c

  1. /***gcc -o libpycall.so -shared -fPIC pycall.c*/  
  2. #include <stdio.h>
  3. #include <stdlib.h>
  4. int foo(int a, int b)  
  5. {  
  6.   printf("you input %d and %d\n", a, b);  
  7.   return a+b;  
  8. }  
(2)gcc編譯生成動態庫libpycall.so:gcc -o libpycall.so -shared -fPIC pycall.c。使用g++編譯生成C動態庫的程式碼中的函式或者方法時,需要使用extern "C"來進行編譯。
(3)Python呼叫動態庫的檔案:pycall.py
  1. import ctypes  
  2. ll = ctypes.cdll.LoadLibrary   
  3. lib = ll("./libpycall.so")    
  4. lib.foo(1, 3)  
  5. print '***finish***'  
(4)執行結果:

2、Python呼叫C++(類)動態連結庫 

       需要extern "C"來輔助,也就是說還是隻能呼叫C函式,不能直接呼叫方法,但是能解析C++方法。不是用extern "C",構建後的動態連結庫沒有這些函式的符號表。
(1)C++類檔案:pycallclass.cpp
  1. #include <iostream>
  2. using namespace std;  
  3. class TestLib  
  4. {  
  5.     public:  
  6.         void display();  
  7.         void display(int a);  
  8. };  
  9. void TestLib::display() {  
  10.     cout<<"First display"<<endl;  
  11. }  
  12. void TestLib::display(int a) {  
  13.     cout<<"Second display:"<<a<<endl;  
  14. }  
  15. extern "C" {  
  16.     TestLib obj;  
  17.     void display() {  
  18.         obj.display();   
  19.       }  
  20.     void display_int() {  
  21.         obj.display(2);   
  22.       }  
  23. }  
(2)g++編譯生成動態庫libpycall.so:g++ -o libpycallclass.so -shared -fPIC pycallclass.cpp。
(3)Python呼叫動態庫的檔案:pycallclass.py
  1. import ctypes  
  2. so = ctypes.cdll.LoadLibrary   
  3. lib = so("./libpycallclass.so")   
  4. print 'display()'  
  5. lib.display()  
  6. print 'display(100)'  
  7. lib.display_int(100)  
(4)執行結果:

3、Python呼叫C/C++可執行程式

(1)C/C++程式:main.cpp
  1. #include <iostream>
  2. using namespace std;  
  3. int test()  
  4. {  
  5.     int a = 10b = 5;  
  6.     return a+b;  
  7. }  
  8. int main()  
  9. {  
  10.     cout<<"---begin---"<<endl;  
  11.     int num = test();  
  12.     cout<<"num="<<num<<endl;  
  13.     cout<<"---end---"<<endl;  
  14. }  
(2)編譯成二進位制可執行檔案:g++ -o testmain main.cpp。
(3)Python呼叫程式:main.py
  1. import commands  
  2. import os  
  3. main = "./testmain"
  4. if os.path.exists(main):  
  5.     rc, out = commands.getstatusoutput(main)  
  6.     print 'rc = %d, \nout = %s' % (rc, out)  
  7. print '*'*10  
  8. f = os.popen(main)    
  9. data = f.readlines()    
  10. f.close()    
  11. print data  
  12. print '*'*10  
  13. os.system(main)  
(4)執行結果:

4、擴充套件Python(C++為Python編寫擴充套件模組

       所有能被整合或匯入到其它python指令碼的程式碼,都可以被稱為擴充套件。可以用Python來寫擴充套件,也可以用C和C++之類的編譯型的語言來寫擴充套件。Python在設計之初就考慮到要讓模組的匯入機制足夠抽象。抽象到讓使用模組的程式碼無法瞭解到模組的具體實現細節。Python的可擴充套件性具有的優點:方便為語言增加新功能、具有可定製性、程式碼可以實現複用等。
       為 Python 建立擴充套件需要三個主要的步驟:建立應用程式程式碼、利用樣板來包裝程式碼和編譯與測試。
(1)建立應用程式程式碼
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <string.h>
  4. int fac(int n)  
  5. {  
  6.     if (n <2) return(1); /* 0! == 1! == 1 */  
  7.     return (n)*fac(n-1); /* n! == n*(n-1)! */  
  8. }  
  9. char *reverse(char *s)  
  10. {  
  11.     register char t,                    /* tmp */  
  12.             *p = s,                     /* fwd */  
  13.             *q = (s + (strlen(s) - 1)); /* bwd */  
  14.     while (p <q)               /* if p <q */  
  15.     {  
  16.         t = *p;         /* swap & move ptrs */  
  17.         *p++ = *q;  
  18.         *q-- = t;  
  19.     }  
  20.     return(s);  
  21. }  
  22. int main()  
  23. {  
  24.     char s[BUFSIZ];  
  25.     printf("4! == %d\n", fac(4));  
  26.     printf("8! == %d\n", fac(8));  
  27.     printf("12! == %d\n", fac(12));  
  28.     strcpy(s, "abcdef");  
  29.     printf("reversing 'abcdef', we get '%s'\n", \  
  30.         reverse(s));  
  31.     strcpy(s, "madam");  
  32.     printf("reversing 'madam', we get '%s'\n", \  
  33.         reverse(s));  
  34.     return 0;  
  35. }  
       上述程式碼中有兩個函式,一個是遞迴求階乘的函式fac();另一個reverse()函式實現了一個簡單的字串反轉演算法,其主要目的是修改傳入的字串,使其內容完全反轉,但不需要申請記憶體後反著複製的方法。
(2)用樣板來包裝程式碼
        介面的程式碼被稱為“樣板”程式碼,它是應用程式程式碼與Python直譯器之間進行互動所必不可少的一部分。樣板主要分為4步:a、包含Python的標頭檔案;b、為每個模組的每一個函式增加一個型如PyObject* Module_func()的包裝函式;c、為每個模組增加一個型如PyMethodDef ModuleMethods[]的陣列;d、增加模組初始化函式void initModule()。
  1. #include <stdio.h>
  2. 相關推薦

    pythonc++的混合呼叫

    最近用c++寫了一個基於Hidden Markov的輸入法,說是輸入法,其實只有兩個功能,一個功能是讀入語料庫,另一個是輸入拼音返回輸出的漢字。寫完了之後,我在想,既然python這麼好用,我又不想重寫一遍輸入法的程式碼,那麼能不能用python呼叫c++現成的

    PythonC/C++的混合呼叫

    一、問題      Python模組和C/C++的動態庫間相互呼叫在實際的應用中會有所涉及,在此作一總結。 二、Python呼叫C/C++ 1、Python呼叫C動態連結庫         Python呼叫C庫比較簡單,不經過任何封裝打包成so,再使用python的ct

    003 PythonC語言的區別(未完)

    特點 .com 裏的 mar dom info pytho alt 溢出 #寫在前面的話:重點記錄Python的特點 Python特點: 1. 無分號斷句 2. 不用擔心溢出問題 3. if-else的用法不同 #if或else後面都要添加冒號

    PythonC之間的相互呼叫Python C API及Python ctypes庫)

    分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!http://blog.csdn.net/jiangjunshow 也歡迎大家轉載本篇文章。分享知識,造福人民,實現我們中華民族偉大復興!        

    PythonC/C++混合程式設計的應用

    我看到的一個很好的Python與C/C++混合程式設計的應用是NS3(Network Simulator3)一款網路模擬軟體,它的內部計算引擎需要用高效能,但在使用者建模部分需要靈活易用。NS3的選擇是使用C/C++來模擬核心部件和協議,用python來建模和擴充套件。 這篇文章介紹Python和C/C++

    PythonC混合程式設計!是PythonC都不具備的超能力!

        編寫 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例項淺談之三PythonC/C++相互呼叫

    一、問題      Python模組和C/C++的動態庫間相互呼叫在實際的應用中會有所涉及,在此作一總結。 二、Python呼叫C/C++ 1、Python呼叫C動態連結庫         Python呼叫C庫比較簡單,不經過任何封裝打

    pythonC/C++相互呼叫

    C/C++呼叫python python作為一種膠水語言可以很靈活的嵌入到C++和java等主語言裡面進行互操作實現擴充套件功能。 方法1:使用python提供的C介面(基礎) 使用python提供給C/C++的API,將python程式程式設計文字形式的動態連結庫,可

    MatlabC/C++混合程式設計之Matlab呼叫OpenCV庫函式

    研究計算機視覺的同學們對OpenCV和Matlab應該非常熟悉,OpenCV作為最大的計算機視覺開源庫已經得到了非常廣泛的使用,在視覺研究領域的地位不可動搖,其主要是基於C/C++實現的,主要的開發平臺包括VS,Qt等等。Matlab以其在矩陣運算方面獨有的優勢在影象處理領

    pythonC#的互相呼叫

    python與C#的互相呼叫 一、C#呼叫python 新建一個專案,新增引用:IronPython.dll,Microsoft.Scripting.dll(在IronPython的安裝目錄中)。 建立一個文字檔案命名為hello.py,把該檔案新增的當

    pythonC++的相互呼叫(2)

    上文簡單介紹了python,以及在C中進行python模組的匯入、函式、類介面的獲得等比較基本的操作。接下來我們考慮:當我們已經獲得了函式的介面之後,我們就應該能夠對他進行呼叫了,接下來我們就來說一說函式的引數和返回值的問題。上文已經說了在python的世界裡一切都是以P

    PythonC++之間的相互呼叫例項3: 在Python呼叫C++的結構體和類

    之前在C++中寫的程式,絕大多數都是用類來封裝的。那麼現在想要在Python中進行呼叫,開始的時候是個頭疼的問題。經過將近一天的摸索學習,大概搞明白了一些。下面貼出來一個例子看一下。首先是C++的結構體和類:#pragma once #include <string&g

    Python C/C++ 交互的幾種方式

    pythonpython作為一門腳本語言,其好處是語法簡單,很多東西都已經封裝好了,直接拿過來用就行,所以實現同樣一個功能,用Python寫要比用C/C++代碼量會少得多。但是優點也必然也伴隨著缺點(這是肯定的,不然還要其他語言幹嘛),python最被人詬病的一個地方可能就是其運行速度了。這這是大部分腳本語言

    [轉]opencv3 圖像處理 之 圖像縮放( pythonc++實現 )

    space original 註意 libs 波紋 輸出 uil iostream 3.5 轉自:https://www.cnblogs.com/dyufei/p/8205121.html 一. 主要函數介紹 1) 圖像大小變換 cvResize () 原型: void

    win下vs用c++匯編混合編程環境配置

    asmwin下vs用c++與匯編混合編程環境配置

    PythonC/C++互操作

    增加 包裝 eap c程序 得到 二進制 說明 數據 and Python調用C/C++ Python調用C/C++的方法可以分為兩類: 手寫擴展模塊:除了被調用的C/C++函數外,一般還需要編寫包裹函數、導出表、導出函數、編譯腳本等代碼。 使用封裝庫的接口:比如官方的c

    pythonC,在寫程序時踩過的坑!

    dex 自動 臨時 字符串 ict 不同 size 初始化 存儲 1. python與C有很多相似之處, 其一就是指針的大量應用, 因此在使用臨時變量保存數據, 並將臨時變量傳遞給其他變量時需要創建內存; 例如,在C中, char *temp 每次獲取到不同的

    資料結構演算法 二分法查詢【PythonC】的實現

    程式碼如下: 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函式調用