anaconda3对应的python版本_利用SWIG实现Python调用C/C++!速度快就算了,代码量还特少!...
SWIG簡(jiǎn)介
SWIG是Simplified Wrapper and Interface Generator的簡(jiǎn)稱,它是一個(gè)能將C和C++的程序與其他各種高級(jí)語(yǔ)言諸如Perl,Python,Ruby和Tcl進(jìn)行連結(jié)的開(kāi)發(fā)工具。目前支持的語(yǔ)言:
C# – Mono
C# – MS .NET
Go language
Guile
Java
Javascript – Node.js
Javascript – V8
Javascript – WebKit
Lua
MzScheme/Racket
OCaml
Octave
Perl
PHP
Python
Ruby
Scilab
Tcl/Tk
SWIG與Python
利用SWIG,Python可以現(xiàn)實(shí)以下功能:
用Python調(diào)用C/C++庫(kù)
用Python繼承C++類,并在Python中使用該繼承類
理解腳本語(yǔ)言如何和C/C++交互,首先簡(jiǎn)單說(shuō)一下Python的標(biāo)準(zhǔn)實(shí)現(xiàn)CPython,Python標(biāo)準(zhǔn)的解析器實(shí)現(xiàn)是由C編寫的,基礎(chǔ)功能模塊也都是C編寫的,然后將其編譯成了Python解析器和相關(guān)so, 所以對(duì)于CPython來(lái)說(shuō),其本身解析過(guò)程最終都是通過(guò)執(zhí)行底層C代碼來(lái)進(jìn)行實(shí)現(xiàn)的。官方標(biāo)準(zhǔn)CPython提供了對(duì)應(yīng)的API允許對(duì)Python進(jìn)行擴(kuò)展,CPython擴(kuò)展需要在C/C++代碼中嵌入很多中的API,為了能夠調(diào)用C/C++的函數(shù),需要聲明如何調(diào)用函數(shù),參數(shù)的類型轉(zhuǎn)換等等,很麻煩。
SWIG的目的就是要為C/C++ API提供腳本語(yǔ)言的接口,SWIG所有做的就是解決腳本語(yǔ)言和C/C++交互的問(wèn)題,SWIG所做的事情其實(shí)就是兩件事:
根據(jù)要調(diào)用的C API生成Wrapper函數(shù),作為膠水來(lái)讓腳本解析器和底層C函數(shù)進(jìn)行交互。
為生成的Wrapper函數(shù)生成腳本語(yǔ)言的調(diào)用接口。
完成了對(duì)C/C++函數(shù)腳本語(yǔ)言接口的生成,通過(guò)直接使用腳本語(yǔ)言的接口,調(diào)用對(duì)應(yīng)的Wrapper函數(shù),Wrapper函數(shù)將腳本語(yǔ)言傳入的參數(shù),轉(zhuǎn)換成C的參數(shù),然后調(diào)用對(duì)應(yīng)的C的接口,執(zhí)行完后,Wrapper函數(shù)會(huì)將C返回的結(jié)果,轉(zhuǎn)換成腳本語(yǔ)言的數(shù)據(jù)類型返回給腳本上層。
SWIG的安裝
Windows
安裝SWIG非常的簡(jiǎn)單,僅需要到官方下載后配置環(huán)境變量即可。
Linux
wget http://prdownloads.sourceforge.net/swig/swig-4.0.1.tar.gztar -zxvf swig-4.0.1.tar.gz
cd swig-4.0.1
./configure
make
sudo make install
安裝完后需要添加路徑到.bashrc以便于在任何目錄下都可以操作swig的命令。
nano ~/.bashrc# 添加以下兩行到bashrc中
SWIG_PATH=/usr/local/share/swig/4.0.1
PATH=$PATH:$SWIG_PATH
source ~/.bashrc
使用 swig - version 確認(rèn)版本型號(hào)即為安裝完成。
swig: error while loading shared libraries: libpcre.so.1: cannot open shared object file: No such file or directory問(wèn)題主要是swig使用時(shí),找不到libpcre.so.1文件,我們?cè)谙到y(tǒng)中查找以下它的位置:
sudo find / -name libpcre.so.1查詢后發(fā)現(xiàn)這個(gè)文件都在anaconda的子環(huán)境文件夾中:
/home/qw/anaconda3/lib/libpcre.so.1/home/qw/anaconda3/pkgs/pcre-8.43-he6710b0_0/lib/libpcre.so.1
解決方案:創(chuàng)建軟鏈接
sudo ln -s /home/qw/anaconda3/lib/libpcre.so.1 /usr/lib/libpcre.so.1C語(yǔ)言示例
編寫代碼文件
1、編寫C語(yǔ)言頭文件example.h
int fact(int n);2、 編寫C語(yǔ)言源碼example.c
#include "example.h"int fact(int n) {
????if (n < 0) {
????????return 0;
????}
????if (n == 0) {
????????return 1;
????}
????else {
????????return n * fact(n-1);
????}
}
3、 編寫接口文件example.i
%module example%{
#define SWIG_FILE_WITH_INIT
#include "example.h"
%}
int fact(int n)
%module后面的名字是被封裝的模塊名稱,Python通過(guò)這個(gè)名稱加載程序。
%{…%}之間所添加的內(nèi)容,一般包含此文件需要的一些函數(shù)聲明和頭文件。
最后一部分,聲明了要封裝的函數(shù)和變量。
使用命令行調(diào)用 Swig 方法產(chǎn)生 Python 模塊
swig -python example.i執(zhí)行后會(huì)生成2個(gè)新的文件:example_wrap.c,example.py
利用 distutils 生成動(dòng)態(tài)庫(kù)
新建 setup.py,內(nèi)容如下:
from distutils.core import setup, Extensionexample_module = Extension('_example',
?????????????????????????? sources=['example_wrap.c', 'example.cpp'],
?????????????????????????? )
setup(name='example',
??????version='0.1',
??????author="SWIG Docs",
??????description="""Simple swig example from docs""",
??????ext_modules=[example_module],
??????py_modules=["example"],
??????)
編譯生成庫(kù)文件:
python setup.py build_ext –inplace如果是Linux,執(zhí)行完成后會(huì)在目錄下生成類似 _example.cpython-37m-x86_64-linux-gnu.so 的文件
測(cè)試.so 文件能否順利被python調(diào)用。在example目錄下創(chuàng)建一個(gè)test.py文件。文件內(nèi)容為
import exampleprint(example.fact(4))
其后執(zhí)行python ./test.py看能正常的輸出。
如果是Windows,則會(huì)在目錄下生成類似 _example.cp37-win_amd64.pyd文件。調(diào)用方法稍有區(qū)別:
import _exampleprint(_example.fact(4))
總結(jié)
以上是生活随笔為你收集整理的anaconda3对应的python版本_利用SWIG实现Python调用C/C++!速度快就算了,代码量还特少!...的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 光驱怎么挂载第二个光驱_重装系统下侦测不
- 下一篇: python字典_python字典可变吗