anaconda3对应的python版本_利用SWIG实现Python调用C/C++!速度快就算了,代码量还特少!...
SWIG簡介
SWIG是Simplified Wrapper and Interface Generator的簡稱,它是一個能將C和C++的程序與其他各種高級語言諸如Perl,Python,Ruby和Tcl進行連結的開發工具。目前支持的語言:
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可以現實以下功能:
用Python調用C/C++庫
用Python繼承C++類,并在Python中使用該繼承類
理解腳本語言如何和C/C++交互,首先簡單說一下Python的標準實現CPython,Python標準的解析器實現是由C編寫的,基礎功能模塊也都是C編寫的,然后將其編譯成了Python解析器和相關so, 所以對于CPython來說,其本身解析過程最終都是通過執行底層C代碼來進行實現的。官方標準CPython提供了對應的API允許對Python進行擴展,CPython擴展需要在C/C++代碼中嵌入很多中的API,為了能夠調用C/C++的函數,需要聲明如何調用函數,參數的類型轉換等等,很麻煩。
SWIG的目的就是要為C/C++ API提供腳本語言的接口,SWIG所有做的就是解決腳本語言和C/C++交互的問題,SWIG所做的事情其實就是兩件事:
根據要調用的C API生成Wrapper函數,作為膠水來讓腳本解析器和底層C函數進行交互。
為生成的Wrapper函數生成腳本語言的調用接口。
完成了對C/C++函數腳本語言接口的生成,通過直接使用腳本語言的接口,調用對應的Wrapper函數,Wrapper函數將腳本語言傳入的參數,轉換成C的參數,然后調用對應的C的接口,執行完后,Wrapper函數會將C返回的結果,轉換成腳本語言的數據類型返回給腳本上層。
SWIG的安裝
Windows
安裝SWIG非常的簡單,僅需要到官方下載后配置環境變量即可。
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 確認版本型號即為安裝完成。
swig: error while loading shared libraries: libpcre.so.1: cannot open shared object file: No such file or directory問題主要是swig使用時,找不到libpcre.so.1文件,我們在系統中查找以下它的位置:
sudo find / -name libpcre.so.1查詢后發現這個文件都在anaconda的子環境文件夾中:
/home/qw/anaconda3/lib/libpcre.so.1/home/qw/anaconda3/pkgs/pcre-8.43-he6710b0_0/lib/libpcre.so.1
解決方案:創建軟鏈接
sudo ln -s /home/qw/anaconda3/lib/libpcre.so.1 /usr/lib/libpcre.so.1C語言示例
編寫代碼文件
1、編寫C語言頭文件example.h
int fact(int n);2、 編寫C語言源碼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通過這個名稱加載程序。
%{…%}之間所添加的內容,一般包含此文件需要的一些函數聲明和頭文件。
最后一部分,聲明了要封裝的函數和變量。
使用命令行調用 Swig 方法產生 Python 模塊
swig -python example.i執行后會生成2個新的文件:example_wrap.c,example.py
利用 distutils 生成動態庫
新建 setup.py,內容如下:
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"],
??????)
編譯生成庫文件:
python setup.py build_ext –inplace如果是Linux,執行完成后會在目錄下生成類似 _example.cpython-37m-x86_64-linux-gnu.so 的文件
測試.so 文件能否順利被python調用。在example目錄下創建一個test.py文件。文件內容為
import exampleprint(example.fact(4))
其后執行python ./test.py看能正常的輸出。
如果是Windows,則會在目錄下生成類似 _example.cp37-win_amd64.pyd文件。調用方法稍有區別:
import _exampleprint(_example.fact(4))
總結
以上是生活随笔為你收集整理的anaconda3对应的python版本_利用SWIG实现Python调用C/C++!速度快就算了,代码量还特少!...的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 光驱怎么挂载第二个光驱_重装系统下侦测不
- 下一篇: python字典_python字典可变吗