日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 >

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

發布時間:2025/3/15 45 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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.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 確認版本型號即為安裝完成。

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.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通過這個名稱加載程序。

  • %{…%}之間所添加的內容,一般包含此文件需要的一些函數聲明和頭文件。

  • 最后一部分,聲明了要封裝的函數和變量。

使用命令行調用 Swig 方法產生 Python 模塊

swig -python example.i

執行后會生成2個新的文件:example_wrap.c,example.py

利用 distutils 生成動態庫

新建 setup.py,內容如下:

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,執行完成后會在目錄下生成類似 _example.cpython-37m-x86_64-linux-gnu.so 的文件

測試.so 文件能否順利被python調用。在example目錄下創建一個test.py文件。文件內容為

import example
print(example.fact(4))

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

如果是Windows,則會在目錄下生成類似 _example.cp37-win_amd64.pyd文件。調用方法稍有區別:

import _example
print(_example.fact(4))

總結

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

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。