SWIG / python - C中定义的常量无法访问

时间:2016-11-16 14:36:08

标签: python swig

我正在使用Swig 3.0.7创建python 2.7可调用版本的C函数,以这种方式定义常量:

#define MYCONST 5.0

在以前版本的swig中,这些可以透明地用于python:

import mymodule

x = 3. * mymodule.MYCONST

但现在这会生成一条消息

AttributeError: 'module' object has no attribute 'MYCONST'

'mymodule'中使用常量的函数在内部按预期工作。

有趣的是,如果我在Swig指令文件mymodule.i中包含此行,

#define MYCONST 5.0

然后执行dir(mymodule)返回包含

的列表
['MYCONST_swigconstant', 'SWIG_PyInstanceMethodNew',  (etc.) .... ]

输入python解释器

 mymodule.MYCONST_swigconstant

给出

<built-in function MYCONST_swigconstant>

没有明显的方法来获得价值。

所以我的问题是,是否可以使之前的语法有效,以便mymodule.MYCONST正确评估

如果没有,是否有解决方法?

2 个答案:

答案 0 :(得分:1)

定义不会通过cvar导出到SWIG。您可以执行以下操作

#define MYCONST 5.0
const float gMYCONST = MYCONST;

通过这种方式,您可以向常量添加类型信息,并可以通过

访问它
import mymodule
mymodule.cvar.gMYCONST

我有SWIG 3.0.2并使用此版本,可以使用mymodule.MYCONST访问该定义,但由于其他原因,我通常会将宏定义转换为类型定义。

答案 1 :(得分:1)

我无法重现您的问题。如果以下演示没有帮助,请发布您的构建过程:

test.i:

%module test
%inline %{
#define MYCONST 5.0
%}

Swig 3.0.8并使用VS2012编译成C扩展名:

swig -python test.i
cl /MD /LD /Fe_test.pyd /Ic:\python33\include test_wrap.c -link /libpath:c:\python33\libs

使用:

Python 3.3.5 (v3.3.5:62cf4e77f785, Mar  9 2014, 10:35:05) [MSC v.1600 64 bit (AMD64)] on win32
Type "help", "copyright", "credits" or "license" for more information.
>>> import test
>>> test.MYCONST
5.0