SWIG-如何将一个具有“constdouble*”构造函数的类包装到python中 我必须用SWIG将向量几何向量类从C++包到Python。 此Vector3类的一个构造函数接受常量double*:

SWIG-如何将一个具有“constdouble*”构造函数的类包装到python中 我必须用SWIG将向量几何向量类从C++包到Python。 此Vector3类的一个构造函数接受常量double*:,python,c++,pointers,swig,Python,C++,Pointers,Swig,我想对其进行包装,以便可以在Python中执行此操作: vec = Vector3([1, 2, 3]) 有什么建议吗?我建议将原型更改为 Vector(const double* list, size_t len); 一个完整的示例支持使用 import example v = example.Vector([1.0,2.0,3.0]) 例h #pragma once #include <cstdlib> class Vector { public: Vector()

我想对其进行包装,以便可以在Python中执行此操作:

vec = Vector3([1, 2, 3])

有什么建议吗?

我建议将原型更改为

Vector(const double* list, size_t len);
一个完整的示例支持使用

import example
v = example.Vector([1.0,2.0,3.0])
例h

#pragma once
#include <cstdlib>

class Vector {
 public:
  Vector();
  Vector(double x, double y, double z);
  Vector(const double* list, size_t len);
};
setup.py

from distutils.core import setup, Extension

setup(name="example",
      py_modules=['example'],
      ext_modules=[Extension("_example",
                     ["example.i","example.cpp"],
                     swig_opts=['-c++'],
                  )])

您可以为constdouble*列表编写特定的输入类型映射。注意:该示例没有为简洁性而进行的错误检查,并包含一个用于测试的内联类:

%module test

%include <windows.i>

%typemap(in) const double* list (double value[3]) %{
    for(Py_ssize_t i = 0; i < 3; ++i)
        value[i] = PyFloat_AsDouble(PySequence_GetItem($input, i));
    $1 = value;
%}

%inline %{
#include <iostream>
using namespace std;

class __declspec(dllexport) Vector3
{
    public:
        Vector3(const double* list)
        {
            cout << list[0] << ',' << list[1] << ',' << list[2] << endl;
        }
};
%}

如果你想要,你可以查看NoMPY。我和硬编码长度参数,但确实建议不要这样做,不幸的是,有两个问题:1,我不能改变C++代码,它不是我们的。2-我不能用numpy。我们必须让python代码在一个名为Maya的软件中运行,用于3d计算机动画和fx。由于一些短视的开发,某些python库(如numpy)无法根据嵌入在软件中的python进行编译。无论如何,我感谢你详细的回答,如果没有人回答我能回答你的问题,我当然会接受你的回答。@DanNiero:这是一个重要的限制;请在你的问题中包括这一点。@DanNiero谢谢你。我想回复很少的一个原因是原型Vectorconst double*非常不幸。您可以从numpy.i复制IN_array1宏的功能,并硬编码长度。numpy中的代码。我接受列表参数,而不仅仅是“numpy”数组。基本上马克在另一场比赛中所做的answer@Jens谢谢,我会试试的。我知道这是一个糟糕的案例,但我很好奇,想知道是否有其他人找到了一个合理的方法让它发挥作用。对我来说,不可能,对于这个特定的构造函数,如果解释了原因,这是一个完全可以接受的答案,也就是说。不幸的是,这会引发以下错误:NotImplementedError:重载函数“new_Vector3”的参数数或类型错误。可能的C/C++原型是:gmath::Vector3::Vector3 gmath::Vector3::Vector3::Vector3::Vector3gmath::Vector3 const&gmath::Vector3::Vector3::Vector3 Duble const*我也认为这应该可以,但对于构造函数来说不行,虽然它似乎对一个正常的方法有效…实际上我试过了,但它对一个方法也不起作用。我的错误是,在编译测试用例时,它确实起作用,这就是我生成输出的方式,但是如果没有关于特定类的更多信息,很难说出应用该技术的错误。错误消息暗示没有应用类型映射。如上所述,只有当参数名为list时,typemap才会起作用。确保参数名与const double*构造函数上使用的参数名匹配,或将其删除,以便在所有const double参数上使用typemap。@DanNiero能否提供Vector3的整个头文件定义?还有,你是在Windows上还是别的什么?什么编译器?另外,显示您的.i文件尝试。确实没有足够的信息来解决您的问题。
%module example
%{
#define SWIG_FILE_WITH_INIT
#include "example.h"
%}

%include "numpy.i"

%init {
  import_array();
}

%apply (double* IN_ARRAY1, size_t DIM1)         \
{(const double* list, size_t len)}

%include "example.h"
from distutils.core import setup, Extension

setup(name="example",
      py_modules=['example'],
      ext_modules=[Extension("_example",
                     ["example.i","example.cpp"],
                     swig_opts=['-c++'],
                  )])
%module test

%include <windows.i>

%typemap(in) const double* list (double value[3]) %{
    for(Py_ssize_t i = 0; i < 3; ++i)
        value[i] = PyFloat_AsDouble(PySequence_GetItem($input, i));
    $1 = value;
%}

%inline %{
#include <iostream>
using namespace std;

class __declspec(dllexport) Vector3
{
    public:
        Vector3(const double* list)
        {
            cout << list[0] << ',' << list[1] << ',' << list[2] << endl;
        }
};
%}
>>> import test
>>> v = test.Vector3([1.1,2.2,3.3])
1.1,2.2,3.3