python如何呼叫c編譯好可執行程式

2022-09-15 10:42:15 字數 3137 閱讀 7866

python如何呼叫c編譯好可執行程式

以下總結出幾種在python 中呼叫 c/c++ **的方法

發現做便捷的是使用popen

from os import popen

popen('/home/pengyan/downloads/vic/sanxia/vicnl -g /home/pengyan/downloads/vic/sanxia/xings_global')

popen('/home/pengyan/downloads/vic/sanxia/rout /home/pengyan/downloads/vic/sanxia/xings_rout')

?? 目前還不會用python 切換檔案目錄

可以採用絕對路徑,但是好像絕對路徑時,計算速度變慢

使用ctypes 模組呼叫 c 動態庫

從python2.5 開始, python 開始提供 ctypes 模組來提供對 c 語言編譯的動態庫檔案的呼叫。注意,  這裡特指c 的動態庫 ,用c++ 編譯的動態庫 ctypes 雖然能夠載入,但呼叫時的函式名已經由於 c++ 的過載特性被加以修改,難以呼叫。 使用 ctypes 呼叫 c 動態庫的好處在於不用進行額外的開發,可以直接使用編譯好的動態庫。 ctypes 提供了完整的 c 型別封裝,也支援自定義型別,大大減少在呼叫過程中的工作量。 ctypes 的使用很簡單,只需熟悉 python 封裝與 c 中的對應關係即可。以下用乙個簡單的例子來說明:

from  ctypes  import  * #匯入ctypes模組

libc = cdll.loadlibrary("libc.so.6") #載入libc動態庫

str  = c_char_p(' hello world! ') #使用char *在ctypes中的對應封裝c_char_p,相當於char* str=」hello world!」

libc.printf(「yell: %s\n」,  str ) #呼叫printf函式

ctypes的功能當然遠不止這些,有興趣的同學可以參考這裡

使用python 的擴充套件( extending )機制

ctypes很方便地可以呼叫 c 的動態庫,但是對 c++ 編譯的動態庫,呼叫起來很困難。這種情況利用 python 的 extending 機制就可以解決。 python 提供了一套完整的框架來使用 c/c++ 編寫擴充套件庫,可以很靈活的開發 c++ 擴充套件模組。這種方法的缺點是工作量比較大,需要為每乙個方法編寫介面,這裡不做詳細介紹,可以參考:

那麼有什麼辦法可以高效的呼叫c++ 動態庫呢,答案是 swig 。

使用swig 生成擴充套件模組

上面提到了python 的擴充套件機制,缺點是工作量比較大,這裡介紹乙個工具 swig 。 swig 是一種簡化指令碼語言與 c/c++ 介面的開發工具,通過包裝和編譯 c 語言程式來達到與指令碼語言通訊目的的工具。它正是基於 python 的擴充套件機制,自動生成介面檔案,再編譯成可以被 python 呼叫的動態庫擴充套件模組。

使用swig 生成擴充套件模組分為以下幾步:

將需要呼叫的**編譯成目標檔案(.o) ;

用swig 讀取編寫描述檔案 (.i) ,生成介面檔案 (.cxx) ;

將介面檔案編譯為目標檔案(.o) ;

將介面檔案的目標檔案和原**段的目標檔案一起編譯成動態庫 ;

假設有如下檔案

swig_ex.cpp 需要轉換成擴充套件庫的原始**,包含乙個int fact(int) 函式

swig_ex.h  原始**的標頭檔案

swig_ex.i swig描述檔案

swig_ex.i是乙個描述檔案,有 swig 自己的語法,比較簡單,內容如下:

%module swig_ex

%int fact(int n);

再寫乙個makefile 來把這些檔案編譯成動態庫 :

all: swig_ex.o swig_ex_wrap.o _swig_ex.so

swig_ex.o: swig_ex.cpp swig_ex.h #編譯原始檔

g++ -fpic -c swig_ex.cpp

swig_ex_wrap.o: swig_ex.i swig_ex.o #根據 swig 描述檔案 (.i) 生成介面檔案 (.cxx) ,再編譯之

swig -c++ -python swig_ex.i

g++ -o2 -fpic -c swig_ex_wrap.cxx -i/home/work/linyi/autoframe/tool/python/include/python2.6/

_swig_ex.so: swig_ex_wrap.o #將目標檔案打包成動態庫

g++ -shared swig_ex.o swig_ex_wrap.o -o _swig_ex.so

.phony: clean

clean:

rm -rf swig_ex_wrap.* swig_ex.py _swig_ex.so

編譯好以後會有乙個so 和 py 檔案,寫乙個 setup.py 把他們安裝到 python 目錄就可以和其他模組一樣被 python 呼叫了:

import swig_ex

swig_ex.fact(10)

原始但有效的方法

除了上面這些方法,在python 中借用 c/c++ **最原始有效的方法就是將**編譯成可執行程式,從 python 裡用 popen 方法來呼叫獲取輸出。這種方法簡單有效,缺點是不夠靈活,有比較大的侷限性,不過在很多情況下也已經足夠了。

pipe = os.popen('./tool –a %s –b %s' % (「hello」, 「world」))

re = pipe.read()

其他方法

以上這些方法基本上已經能滿足python 呼叫 c/c++ 的需求了,此外還有一些方法,例如使用 boost.python ,使用 pyrex ,這些方法都能提供 python 與 c/c++ 的互動。

總結

在python 中引用 c/c++ 模組的方法較多,根據需要從中選擇恰當的方法可以減少很多任務作量。

在python 中引用 c/c++ 模組彌補了 python 指令碼測試框架的很多不足,在提高**復用率的同時,模組的效能也大大提高。

python呼叫c資料 Python如何呼叫C

前言 python語言特點 簡單,明確,優雅,高效率,同時python語言的可擴充套件性和可嵌入性很強,又被成為 膠水語言 但是python語言有乙個最大的缺點,便是執行速度慢,所以當你對速度有要求時,你可以用c語言來編寫你的關鍵 或者當你希望某些演算法不公開時,也可以把你的程式用c編寫,然後在你的...

如何解壓編譯好的img檔案

1.yaffs 執行命令 unyaffs custpack.img即可將 custpack.img 的內容解壓到當前路徑。2.ext4 專案編譯後會生成工具 simg2img 和 make ext4fs 位於 out host linux x86 bin 使用 simg2sim 生成新的 image...

c 函式呼叫到底是如何編譯的

總結一下c 本地函式呼叫的編譯過程,暫不考慮外部函式呼叫的編譯過程,那些涉及到鏈結的知識。遇到函式呼叫語句 解析出函式的名字 解析出函式呼叫的引數資訊 引數個數和型別 開始根據名稱查詢函式定義,查詢的過程是由內而外的,包括從內部作用域到外部作用域 從內層的命名空間到外層的命名空間 從子類到父類。查詢...