文件名为 example.cpp 。

2. 定义SWIG界面文件

// This line declares the module name as example. The module name 
// is what you'll use to import the generated module in the target 
// language (e.g., import example in Python).
%module example // interface to the example c++ library
// The %{ %} block is used to include the header files and any 
// other necessary C/C++ code that should be directly copied into 
// the generated wrapper code.
    // includes the SWIG interface file for the std::vector class template.
    #include "example.h" 
%include "std_vector.i";
using namespace std;
// creates a new template instantiation for std::vector<double>, naming
// it DoubleVector. This means that std::vector<double> will be wrapped 
// and available as DoubleVector in the target language.
%template(DoubleVector) vector<double>;
// This line includes the example.h header file again but this time in 
// the context of the SWIG processing. This inclusion tells SWIG to parse 
// and wrap the declarations in example.h according to the specified SWIG directives.
%include example.h

将文件存为example.i。

3. 生成Python wrapper

如果没有安装SWIG,应首先在当前Python环境下安装SWIG:

pip install swig

然后执行如下命令行:

swig -c++ -python .\example.i

执行完毕后应该生成了example.py和example_wrap.cxx两个文件。

4. 编写setup.py文件

#!/usr/bin/env python
from distutils.core import setup, Extension
# from setuptools import setup, Extension   # for python >3.12
example_module = Extension(
    '_example',
    sources = ['example_wrap.cxx', 'example.cpp']
setup (
    name = 'example',
    version = '0.1',
    author      = "Bin Yang",
    description = """Simple swig example from docs""",
    ext_modules = [example_module],
    py_modules = ["example"],

5. 编译生成可供调用的包

5.1 Ubuntu系统

执行如下命令:

python setup.py build_ext --inplace

测试时所使用的版本为Python 3.8。执行过后在当前文件夹下可以直接调用example包:

import example
example.square([1,2])

应该得到如下输出:

[1, 4]

5.2 Windows

在Windows系统下需要先安装微软的c++开发工具,总共约7GB大小!

然后执行与5.1节一样的命令。使用方法也相同。测试使用的为Python 3.9。

教程链接:

SWIG C++ python demo - YouTube

bilibili~Tieba(=・ω・=)
bili_smiliesbili_smiliesbili_smiliesbili_smiliesbili_smiliesbili_smiliesbili_smiliesbili_smiliesbili_smiliesbili_smiliesbili_smiliesbili_smiliesbili_smiliesbili_smiliesbili_smiliesbili_smiliesbili_smiliesbili_smiliesbili_smiliesbili_smiliesbili_smiliesbili_smiliesbili_smiliesbili_smiliesbili_smiliesbili_smiliesbili_smiliesbili_smiliesbili_smiliesbili_smiliesbili_smiliesbili_smiliesbili_smiliesbili_smiliesbili_smiliesbili_smiliesbili_smiliesbili_smiliesbili_smiliesbili_smiliesbili_smiliesbili_smiliesbili_smiliesbili_smiliesbili_smiliesbili_smiliesbili_smiliesbili_smiliesbili_smiliesbili_smilies
tieba_smilietieba_smilietieba_smilietieba_smilietieba_smilietieba_smilietieba_smilietieba_smilietieba_smilietieba_smilietieba_smilietieba_smilietieba_smilietieba_smilietieba_smilietieba_smilietieba_smilietieba_smilietieba_smilietieba_smilietieba_smilietieba_smilietieba_smilietieba_smilietieba_smilietieba_smilietieba_smilietieba_smilietieba_smilietieba_smilietieba_smilietieba_smilie
(⌒▽⌒)( ̄▽ ̄)(=・ω・=)(`・ω・´)(〜 ̄△ ̄)〜(・∀・)(°∀°)ノ( ̄3 ̄)╮( ̄▽ ̄)╭(´_ゝ`)←_←→_→(<_<)(>_>)(;¬_¬)("▔□▔)/(゚Д゚≡゚д゚)!?Σ(゚д゚;)Σ( ̄□ ̄||)(’;ω;‘)(/TДT)/(^・ω・^ )(。・ω・。)(● ̄(エ) ̄●)ε=ε=(ノ≧∇≦)ノ(’・_・‘)(-_-#)( ̄へ ̄)( ̄ε(# ̄)Σヽ(‘Д’)ノ(#-_-)┯━┯(╯°口°)╯(┴—┴←◡←( ♥д♥)_(:3」∠)_Σ>―(〃°ω°〃)♡→⁄(⁄ ⁄•⁄ω⁄•⁄ ⁄)⁄(╬゚д゚)▄︻┻┳═一・*・:≡( ε:)(笑)(汗)(泣)(苦笑)