1. 程式人生 > >Python介面(3):Python例項淺談之三Python與C/C++相互呼叫

Python介面(3):Python例項淺談之三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. 相關推薦

    Python介面(3):Python例項PythonC/C++相互呼叫

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

    Python例項Python守護程序和指令碼單例執行

    一、簡介      守護程序最重要的特性是後臺執行;它必須與其執行前的環境隔離開來,這些環境包括未關閉的檔案描述符、控制終端、會話和程序組、工作目錄以及檔案建立掩碼等;它可以在系統啟動時從啟動指令碼/etc/rc.d中啟動,可以由inetd守護程序啟動,也可以有作業規劃程

    UART串列埠通訊()--字元資料的轉換

    版權宣告:本文為博主原創文章,未經博主允許不得轉載。 https://blog.csdn.net/solar_Lan/article/details/78093692 學串列埠通訊的應用主要是實現微控制器和電腦之間的資訊互發,可以用電腦控制微控制器的一些資訊,可以把微控制器的一些資訊狀況發給電腦

    Python例項四遞迴求斐波那契、階乘、累加和

    一、問題 指令碼遞迴求斐波那契、階乘和、累加和函式的執行。先在單執行緒中執行這三個函式,然後在多執行緒中做同樣的事,以說明多執行緒的好處。以及子類化threading執行緒模組的Thread類,靈活地來自定義執行緒物件。 二、解決 1、程式碼 #!/usr/bin/

    Python例項九使用本地socket檔案

           首先,socket的連線地址是一個檔案的路徑而不是一個包含服務地址和埠號的元組;第二,當socket關閉後,socket檔案不會被刪除,該檔案代表一個永久的socket連線,所以每次伺服器啟動時,都需要手動刪除該檔案。第三,address family需要使用AF_UNIX而不是AF_INET

    shell例項九格式化輸出大數字

    一、問題       格式化輸出大數字,使得輸出結果更清晰地看出數字的數量級。預設用逗號(可用-d指定整數的分隔符)分隔整數部分,用點號(可用-t指定整數與小數的分隔符)分隔整數與小數部分。如1123456789.012輸出為1,123,456,789.012。 二、詳

    shell例項七檢測使用者輸入串的合法性

    一、問題 要求使用者輸入的串由大小寫字母、數字組成,無標點、特殊符號和空格。 二、詳解 1、替換法 將輸入的串中非字母數字的內容刪除或替換成空後,若與原來輸入的相同則合法,否則不合法。 #!/bin/bash isValidAlphaNumber() { r

    shell例項十檢測整數、浮點數和日期數的合法性

    一、問題       實際工作中,經常會碰到對數值的檢測,在此將檢測整數、浮點數和日期的合法性綜合在一起,總結各種不同的檢測方法。特別是日期總結了shell處理日期非常好的方法,可以借鑑使用,每個函式都可以根據需要獨立提取出來。 二、詳解 (1)檢測輸入整數的合法性

    shellfor、while、until迴圈

    一、簡介 Shell程式設計中迴圈命令用於特定條件下決定某些語句重複執行的控制方式,有三種常用的迴圈語句:for、while和until。while迴圈和for迴圈屬於“當型迴圈”,而until屬於“直到型迴圈”。迴圈控制符:break和continue控制流程轉向。

    Qt十二二維碼條形碼解析

    一、簡介         二維條碼/二維碼(2-dimensional bar code)是用某種特定的幾何圖形按一定規律在平面(二維方向上)分佈的黑白相間的圖形記錄資料符號資訊的,其應用廣泛,如:產品防偽/溯源、廣告推送、網站連結、資料下載、商品交易、定位/導航、電子憑

    Python總結(整理)

    一、簡介       Python各方面的程式設計內容總結下來並不斷更新,以便以後使用時查詢。 二、詳解 1、Python獲取路徑檔名 (1)split()函式進行字串分割  (2)basename()函式 2、Python下的SQlite資料庫        P

    Python例項之一識別符號檢查

    一、問題 Python識別符號必須以字母或下劃線開頭,後面跟字母、下劃線或者數字,且識別符號不能為關鍵字,如何有效的檢查? 二、解決 1、方法一 (1)python指令碼 新建idcheck.py,輸入程式碼,然後執行pythonidcheck.py。 #!/usr/b

    Python進階(十二)-python中的方法

    分享一下我的偶像大神的人工智慧教程!http://blog.csdn.net/jiangjunshow 也歡迎轉載我的文章,轉載請註明出處 https://blog.csdn.net/mm2zzyzzp Python進階(十二)-淺談python中的方法

    Qt五十介面自定義

    一、簡介       Qt自帶的介面不利於樣式的調整和美化,自定義介面便於設計風格。 二、詳解 1、程式碼 (1)pagenumbercontrol.h #ifndef PAGENUMBERCONTROL_H #define PAGENUMBERCONTROL_H

    Windows8Metro經典Windows介面

    千呼萬喚下,Windows 8終於出來了,我想無論是使用者還是華爾街的大亨,尤其是像Intel這些都等了太久太久了,再不出來後者就要抓狂了(原因是因為計算機業的生態鏈)。 在Windows 8出來之後,我勇敢地做了一把小白鼠,先去下載了"帶有開發者工具的64位版",接著用E

    simhash及其python實現

    轉自http://blog.csdn.net/madujin/article/details/53152619 2016-11-13 21:52 1479人閱讀 評論(0) 收藏 舉報 作者原創,轉載請註明出處。 一直想寫個總結來回顧simhash,一直沒抽

    Qt二十一log調試日誌

    gms 生成文件 _file__ ica 沒有 rest delet mar 排除 一、簡單介紹 近期因調試code時,想了解程序的流程,但苦於沒有一個簡易的日誌記錄,不停使用qDebug打印輸出,而終於提交代碼時得去多次刪除信息打印,有時還會出現新改動

    JAVAEE企業級應用開發MVC 中的V-VIEW視圖

    插入 第一次 開發 優點 就會 mil 是否 javaee 方便 Step1.情景概要 Hello,小夥伴們,好久不見,之前跟大家分享了三層架構與MVC思想,相信大家對於這兩塊內容有了相對清晰的個人認識了,既然我們講到了MVC,這裏我們接著這塊內容繼續往下深入,今天我們來看

    學習路(五)種語句結構,vim編輯器快捷鍵及使用方法,find命令使用

    vim編輯器循環;forwhileuntil for 變量 in 列表; do 循環體 done e.g for I in ‘seq 1 $FILE‘ ; doecho "Hello,‘head -n $I

    EOS webservice介面釋出為wsdl

    package itsmsso; import javax.jws.WebService; import javax.xml.ws.Endpoint; import com.eetrust.eim.plugin.pojo.SyncResult; import com.eetrust.eim.