首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >将C++扩展到Python,未定义的枚举

将C++扩展到Python,未定义的枚举
EN

Stack Overflow用户
提问于 2020-03-26 16:37:12
回答 1查看 327关注 0票数 0

我在C++中扩展/公开我的枚举时遇到了困难。

最初,我创建了一个没有枚举的类"MyClass“的较小版本,并使其正常工作,请参见下面的内容:

SWIG接口文件(MyClassMini.i):

代码语言:javascript
复制
%module MyClassMini
%{
#include "MyClassMini.h"
#include <stdio.h>
#include
#include
using namespace std;
%}
%include "std_string.i"
%include "MyClassMini.h"

发出命令自动生成SWIG包装器、编译和链接:

代码语言:javascript
复制
swig -python -c++ MyClassMini.i

编译与链接:

代码语言:javascript
复制
python setup.py build_ext --inplace

将新模块中的模块加载到Python中,实例化并设置字符串:

输出:

代码语言:javascript
复制
>Python
Type "help", "copyright", "credits" or "license" for more information.
>>> import _MyClassMini
>>> MyClassMini =  _MyClassMini.new_MyClassMini();
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: Wrong number or type of arguments for overloaded function 'new_MyClassMini'.
  Possible C/C++ prototypes are:
    MyClassMini::MyClassMini(int)
    MyClassMini::MyClassMini(int,int)
    MyClassMini::MyClassMini(int,int,int)
    MyClassMini::MyClassMini(int,int,int,int)
>>> MyClassMini =  _MyClassMini.new_MyClassMini(7);
>>> _MyClassMini.delete_MyClassMini(MyClassMini);
>>> MyClassMini =  _MyClassMini.new_MyClassMini(7);
>>> _MyClassMini.MyClassMini_getType(MyClassMini);
7
>>> _MyClassMini.MyClassMini_getType(MyClassMini);
7
>>> _MyClassMini.MyClassMini_setValueString(MyClassMini,"Im a string");
>>> _MyClassMini.MyClassMini_getValueString(MyClassMini);          
'Im a string'
>>> _MyClassMini.delete_MyClassMini(MyClassMini);

一切都很好。

Enum问题.

我在我的真正成熟的类“MyClass”上重复了同样的狂饮配方,我唯一的麻烦是在枚举上:

#1尝试:

MyClass.i:

代码语言:javascript
复制
%module MyClass
%{
#include "MyClass.h"
#include <stdio.h>
#include <iostream>
#include <cstdlib>
#include "SparseDataType.h"
using namespace std; 
%}

%include "std_string.i" 
%include "MyClass.h"
%include "SparseDataType.h"

SWIG接口文件SparseDataType.i:

代码语言:javascript
复制
%module SparseDataType
%{
  enum SparseDataType
        {
            SparseBool,
            SparseChar,
            SparseByte, // unsigned char
            SparseInt,
            SparseShort,
            SparseFloat,
            SparseDouble,
            SparseString,
            SparseComposite
        };
%}

一些MyClass.h的片段:

代码语言:javascript
复制
#ifndef MyClass_H
#define MyClass_H
#include <stdio.h>
#include <iostream>
#include <string.h>
#include "SparseDataType.h"
using namespace std;

class MyClass
{
public:

        /*constructors:*/
               /*if type is scaler, assume size 1
         n is size (if type is scalar, ignore size)*/
               MyClass (SparseDataType SparseDataType)
        {
             size = _n3 = _n2 = _n1= 1;  
            _type =  SparseDataType;
             alloc();
        }
               MyClass  (SparseDataType SparseDataType, int size_n1)
        {
            size = _n1= size_n1; 
            _n2 = _n3 = 1; 
           _type =  SparseDataType;
           alloc();
        }
        // 2d array
               MyClass (SparseDataType SparseDataType, int size_n2 , int size_n1)  
        {
            _n1 =  size_n1; 
            _n2 = size_n2; 
            _n3 = 1; 
            size =  _n2 * _n1;  
            _type =  SparseDataType;
            alloc();
        }
        // 3d array
               MyClass  (SparseDataType SparseDataType, int size_n3 , int size_n2, int size_n1)
        {
             _n3 = size_n3;
             _n2 = size_n2;  
             _n1 = size_n1;  
            size =  _n3 * _n2 * _n1;  
            _type =  SparseDataType;
             alloc();
        }
//etc…       
}

I edited setup.py to  include SparseDataType:

from distutils.core import setup, Extension


MyClass_module = Extension('_MyClass',
                           sources=['MyClass_wrap.cxx'],
                           )


SparseDataType_module = Extension('_SparseDataType',
                           sources=['SparseDataType_wrap.cxx'],
                           )

setup (name = 'MyClass',
       version = '0.1',
       author      = "SWIG Docs",
       description = """Simple swig MyClass from docs""",
       ext_modules = [MyClass_module,SparseDataType_module],
       py_modules = ["MyClass"],
       )

**Then I ran SWIG wrapper auto-generation commands again & compilation & linking  again:**

swig -python -c++ MyClass.i

swig -python -c++ SparseDataType.i

python setup.py build_ext –inplace

到目前为止没有错误,都编译好了。导入python很好,但是实例化有问题(枚举类型没有解决):

代码语言:javascript
复制
devlinux{user1}% python
Python 2.7.5 (default, Aug  2 2016, 04:20:16)
[GCC 4.8.5 20150623 (Red Hat 4.8.5-4)] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> import _MyClass
>>> import _SparseDataType
>>> MyClass = _MyClass.new_MyClass(_SparseDataType.SparseInt);
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
AttributeError: 'module' object has no attribute 'SparseInt'

尝试#2已更改,%模块SparseDataType.i (基于Wrapping C-enum in a Python module with Swig):

代码语言:javascript
复制
%module SparseDataType
%inline %{

    struct mySparseDataType {

        enum {
            SparseBool,
            SparseChar,
            SparseByte, // unsigned char
            SparseInt,
            SparseShort,
            SparseFloat,
            SparseDouble,
            SparseString,
            SparseComposite
        };
    };
%}

然后,我重新运行命令:

代码语言:javascript
复制
swig -python -c++ MyClass.i

swig -python -c++ SparseDataType.i

python setup.py build_ext –inplace

到目前为止没有错误,全部编译过.

代码语言:javascript
复制
devlinux{user1}% python
>>> import _MyClass                                                    
>>> import _SparseDataType                                                
 >>> MyClass = _MyClass.new_MyClass(_SparseDataType.mySparseDataType.SparseInt);
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
AttributeError: 'module' object has no attribute 'mySparseDataType'
>>> MyClass = _MyClass.new_MyClass(_SparseDataType.SparseInt);         Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
AttributeError: 'module' object has no attribute 'SparseInt'
>>> MyClass = _MyClass.new_MyClass(mySparseDataType.SparseInt);        Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
NameError: name 'mySparseDataType' is not defined

再次无法解析枚举“未定义”??

对于如何从Python调用枚举有什么想法吗?

多谢百万!

EN

回答 1

Stack Overflow用户

发布于 2020-03-27 00:23:15

import SparseDataType而不是import _SparseDataType。后者直接导入_SparseDataType.pyd,并绕过要导入的SparseDataType.py包装器。

然后,SparseDataType.mySparseDataType.SparseInt将访问枚举值。enum位于一个结构中,因此需要module.structure.enum来访问它。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/60871941

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档