開博客這么久以來,第一篇技術文章,python與c的接口對接


  在博客園開博客已經有了蠻長時間了,但是從來只是看別人的文章,自己卻從未寫過一篇技術文章,深表慚愧。內心還是希望能夠給大家提供一些幫助的,希望這第一篇技術博客,能夠給大家一些幫助。閑話少敘,開始正文。

  最近在做和python相關的項目,需要對接C++算法庫,這對於我這種剛剛接觸python的新手來說,着實有些麻煩,而且,新平台又是在python3上進行的,因此還需要考慮到,python3與python2.7的不同之處,還真心感到有點混亂,不過經過努力終於成功的實現了,python與c++算法庫的對接。現在將實現過程記錄如下:

  首先python是支持調用C庫的,這也是python能夠廣泛被使用的原因之一,但是C++與C還是有所不一樣,因此適用於C的方法,到了C++這里要做點相應的改動。如下:

     在C++中有這樣的類函數:

    int ClassA :: process (char *p, int a, int b)

{

.......

}

  將這個process接口函數 聲明為C函數

 extern "c"

{

  ClassA c;

  process_python(char* p, int a, int b){

  c.process(p, a, b);

}

將c庫用gcc 編譯為.so,這個過程網上有很多,不贅述,直奔主題。python調用c的.so庫不需要額外的封裝接口,十分方便。將c++的接口函數聲明為C類型后,就可以在python中直接使用了。是不是該結束?No,如果到此就結束了,網上有好多,我還寫啥啊,這里要說的是后面實現的注意事項。

python 調用C函數的方法

在python中采用ctypes模塊來進行調用,在python2.5之后,該模塊都被集成在python中,不需要安裝,直接使用即可。

#!/usr/bin/python3

from ctypes import *

import os

import sys

 

if __name__ == "__main__":

  libtest = cdll.LoadLibrary(os.getcwd() + '/libprocess.so')

      test = libtest.process_python

      test.argtypes = [c_char_p, c_int, c_int]  #這里要特別注意,一定要聲明函數的輸入類型,轉化為C類型,不然C接口是不認識輸入數據的

      test(sys.argv[1].encode(), int(sys.argv[2]), int(sys.argv[3])) #這里也要注意,因為在python3中string和bytes不同,需要進行編解碼轉換,不然數據類型是不匹配的

      #還有一點,C++中有string類,但是C語言中沒有,所以接口函數如果有string類的要替換為char型

注意了以上幾點就可以正常運行了,說來簡單,但是自己摸索的時候,真心花費了大量時間,希望大家不要走重復的彎路。

  最后,希望大家多多和我交流,提意見,有更好的實現方法和不足之處也歡迎大家,指出。不吝賜教喲~^_^

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM