python - 使用 SWIG 将 C++ 文件包装为 Python 文件

标签 python c++ ubuntu-16.04 swig

我是 SWIG 的新手,作为一名程序员,我有点不知所措。我希望能够通过将包装类导入为模块“import C++_file”来调用 python 2 中 C++ 类的函数,然后在我的 python 类中调用它,例如“C++_file.function” (输入)'。

正在关注 http://intermediate-and-advanced-software-carpentry.readthedocs.io/en/latest/c++-wrapping.html , 我正在包装头文件 multiplyChannel.h:

#include <vector>
#include <complex>

using namespace std;

class MultiplyChannel {
    public:
        MultiplyChannel(double in_alpha);
        void applyToVector(vector<complex<double> > *in_signal);
    private:
        double alpha;
};

对应于我的示例 C++ 文件 multiplyChannel.cpp:

#include "multiplyChannel.h"
#include <vector>
#include <complex>

using namespace std;

MultiplyChannel::MultiplyChannel(double in_alpha){
    this->alpha = in_alpha;
}

void MultiplyChannel::applyToVector(vector<complex<double> > *in_signal){
    unsigned int size = in_signal->size();
    for (int i = 0; i < size; i++) {
        in_signal->at(i).real() = in_signal->at(i).real() * this->alpha;
        in_signal->at(i).imag() = in_signal->at(i).imag() * this->alpha;
    }
}

使用生成文件:

all:
    swig -python -c++ -o mult.cpp swigdemo.i
    python setup.py build_ext --inplace

包装器文件 swigdemo.i:

%module swigdemo

%{
#include <stdlib.h>
#include "multiplyChannel.h"
%}

%include "multiplyChannel.h"

和 setup.py 构建文件:

from distutils.core import setup, Extension

extension_mod = Extension("_swigdemo", ["mult.cpp"])

setup(name = "swigdemo", ext_modules=[extension_mod])

在我的 Ubuntu 命令窗口中输入:

$ make
swig -python -c++ -o multiplyChannel.cpp swigdemo.i
python setup.py build_ext --inplace
running build_ext
$ python setup.py build
running build
running build_ext

使用 C++_tester.py 测试导入,我尝试使用实例变量“in_alpha”为 5x 的 MultiplyChannel 对象“demo”将 vector [1, 2, 3] 乘以 [5, 10, 15] ,将所有输入乘以 5:

#!/usr/bin/python

import swigdemo

if __name__ == '__main__':
    demo = swigdemo.MultiplyChannel(in_alpha=5)
    out = demo.applyToVector(in_signal=[1, 2, 3])
    print(out)

我什至没有通过导入行,收到以下错误:

$ python C++_tester.py
ImportError: ./_swigdemo.so: undefined symbol: _ZN15MultiplyChannelC1Ed

而且我不确定该怎么做,因为我什至无法将 gedit 或 vim 放入 .so 文件中。我猜我的错误在于我的包装器、构建或生成文件中的包装不正确,因为 C++_tester.py 文件中的几乎所有内容都在我的 Pycharm IDE 中自动完成。

非常感谢!

最佳答案

问题确实与扩展构建有关:

  • swigdemo.i - 生成 swig 包装器 (mult.cpp)
  • MultiplyChannel 类实现在 multiplyChannel.cpp
  • 构建扩展时,由于它是一个共享对象 (.so),链接器(默认情况下)不会提示 undefined symbol (如 2 MultiplyChannel 方法(因为它对它们一无所知) - 和其他),但创建它,考虑到符号可以在运行时可用(当 .so 将加载)

简而言之,通过将 multiplyChannel.cpp 添加到扩展源 flies 列表来修改 setup.py:

extension_mod = Extension("_swigdemo", ["mult.cpp", "multiplyChannel.cpp"])

检查 [SO]: SWIG: How to pass list of complex from c++ to python对于您将要遇到的下一个问题。

关于python - 使用 SWIG 将 C++ 文件包装为 Python 文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49499683/

相关文章:

python - 我想转置字符串列表,但出现 TypeError

c++ - 无法在eclipse中链接Opencv静态库(已添加-ldl!)

python - 为什么我在尝试导入 JSON 时收到 IntegrityError?

c++ - 在C++中从exe中获取参数

c++ - C++ 编译器是否针对不同平台(Linux、Windows 等)多次编写?

python - 无法从 Ubuntu 16.04 卸载 anaconda

MongoDB 没有从 ubuntu 16.04 开始

elasticsearch - 在 Travis Xenial 构建主机上运行 Elasticsearch-7.0

python - Python 无法将 0 正确移动到列表末尾

Python pandas - 将 groupby 输出写入文件