在pythoncode块中使用模块定义的常量

时间:2015-07-10 18:26:11

标签: python c++ swig

我的C代码定义了一个常量,我尝试添加使用该常量的python代码(在pythoncode块中),由于某种原因,这不起作用。

演示.i档案:

%module test
%{
// c code defines a static constant
static const int i=3;
%}

// declare the constant so that it shows up in the python module
static const int i;

%pythoncode %{
# try to use the constant in some python code
lookup={'i':i,}
%}

这是错误:

[dave]$ python -c "import test"
Traceback (most recent call last):
  File "<string>", line 1, in <module>
  File "test.py", line 70, in <module>
    lookup={'i':i,}
NameError: name 'i' is not defined

如果我在lookup块中注释掉pythoncode字典,一切正常:

[dave]$ python -c "import test; print test.i"
3

所以至少在导入模块时,常量会出现。

我怎样才能看到&#34;&#34;我的pythoncode块中的C定义常量?

swig 2.0.4,python 2.7。

2 个答案:

答案 0 :(得分:2)

%pythoncode

Adding additional Python code个州:

  

此代码将插入SWIG创建的.py文件中。

让我们拖尾生成的test.py

# try to use the constant in some python code
lookup={'i':i,}

# This file is compatible with both classic and new-style classes.

cvar = _test.cvar
i = cvar.i

在定义%pythoncode之前插入了i。由于它是第一个也是唯一一个外观,您可能需要直接使用_test.cvar.i

%pythoncode %{
# try to use the constant in some python code
lookup={'i': _test.cvar.i,}
%}

答案 1 :(得分:1)

另一种解决方法是在模块完成加载之后推迟引用变量,方法是使用函数:

%pythoncode %{
def lookup( key ){
     mp={'i':i}
     return mp[key]
%}