如何为IronPython访问包装c++代码?

How do you wrap C++ code for IronPython access

本文关键字:c++ 代码 包装 访问 IronPython      更新时间:2023-10-16

我有一个简单的例子,我想从Ironpython访问(我来自'regular/sane' python'),所以我正在努力将我的c++代码导入Ironpython。通常我只使用SWIG,包装代码,导入,然后继续我的工作

但是Ironpython是c#而不是基于C的,这使得这个过程更加困难

如何为ironpython包装这个类(我还为这个例子附加了swig文件,但这可能没有用)

#include "minimal.h"

double average(std::vector<int> v) {
    return std::accumulate(v.begin(), v.end(), 0.0) / v.size();
}
std::vector<double> half(const std::vector<double>& v) {
    std::vector<double> w(v);
    for (unsigned int i = 0; i<w.size(); i++)
        w[i] /= 2.0;
    return w;
}
void halve_in_place(std::vector<double>& v) {
    std::transform(v.begin(), v.end(), v.begin(),
        std::bind2nd(std::divides<double>(), 2.0));
}

和头文件

#include <vector>
#include <algorithm>
#include <functional>
#include <numeric>
double average(std::vector<int> v);
std::vector<double> half(const std::vector<double>& v);
void halve_in_place(std::vector<double>& v);

我有一个swig I文件最小。我但是意识到有很多问题发出swig.exe -c++ -python "%(FullPath)"在此并让ironpython在导入时实际接受它。

%module transfervector
%{
#include "minimal.h"
%}
%include "std_vector.i"
// Instantiate templates used by example
namespace std {
   %template(IntVector) vector<int>;
   %template(DoubleVector) vector<double>;
}
// Include the header file with above prototypes
%include "minimal.h"

SWIG-python不会工作-它生成CPython扩展,而IronPython不支持这些。

最终,您需要包装c++,以便可以从。net访问它。我认为您可以使用SWIG生成c#包装器,然后将其导入IronPython。否则,您可以使用c++/CLI编译器直接编译生成。net程序集,这也可以从IronPython中使用。