日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程语言 > python >内容正文

python

anaconda3对应的python版本_利用SWIG实现Python调用C/C++!速度快就算了,代码量还特少!...

發(fā)布時(shí)間:2025/3/15 python 26 豆豆
生活随笔 收集整理的這篇文章主要介紹了 anaconda3对应的python版本_利用SWIG实现Python调用C/C++!速度快就算了,代码量还特少!... 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

SWIG簡介

SWIG是Simplified Wrapper and Interface Generator的簡稱,它是一個(gè)能將C和C++的程序與其他各種高級(jí)語言諸如Perl,Python,Ruby和Tcl進(jìn)行連結(jié)的開發(fā)工具。目前支持的語言:

  • 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++庫

  • 用Python繼承C++類,并在Python中使用該繼承類

理解腳本語言如何和C/C++交互,首先簡單說一下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來說,其本身解析過程最終都是通過執(zhí)行底層C代碼來進(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提供腳本語言的接口,SWIG所有做的就是解決腳本語言和C/C++交互的問題,SWIG所做的事情其實(shí)就是兩件事:

  • 根據(jù)要調(diào)用的C API生成Wrapper函數(shù),作為膠水來讓腳本解析器和底層C函數(shù)進(jìn)行交互。

  • 為生成的Wrapper函數(shù)生成腳本語言的調(diào)用接口。

完成了對(duì)C/C++函數(shù)腳本語言接口的生成,通過直接使用腳本語言的接口,調(diào)用對(duì)應(yīng)的Wrapper函數(shù),Wrapper函數(shù)將腳本語言傳入的參數(shù),轉(zhuǎn)換成C的參數(shù),然后調(diào)用對(duì)應(yīng)的C的接口,執(zhí)行完后,Wrapper函數(shù)會(huì)將C返回的結(jié)果,轉(zhuǎn)換成腳本語言的數(shù)據(jù)類型返回給腳本上層。

SWIG的安裝

Windows

安裝SWIG非常的簡單,僅需要到官方下載后配置環(huán)境變量即可。

Linux

wget http://prdownloads.sourceforge.net/swig/swig-4.0.1.tar.gz
tar -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

問題主要是swig使用時(shí),找不到libpcre.so.1文件,我們在系統(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.1

C語言示例

編寫代碼文件

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通過這個(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)庫

新建 setup.py,內(nèi)容如下:

from distutils.core import setup, Extension
example_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,執(zhí)行完成后會(huì)在目錄下生成類似 _example.cpython-37m-x86_64-linux-gnu.so 的文件

測試.so 文件能否順利被python調(diào)用。在example目錄下創(chuàng)建一個(gè)test.py文件。文件內(nèi)容為

import example
print(example.fact(4))

其后執(zhí)行python ./test.py看能正常的輸出。

如果是Windows,則會(huì)在目錄下生成類似 _example.cp37-win_amd64.pyd文件。調(diào)用方法稍有區(qū)別:

import _example
print(_example.fact(4))

總結(jié)

以上是生活随笔為你收集整理的anaconda3对应的python版本_利用SWIG实现Python调用C/C++!速度快就算了,代码量还特少!...的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。