我正在使用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
正确评估
如果没有,是否有解决方法?
答案 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