SWIG + setup.py:ImportError:动态模块未定义初始化函数(init_foo)

Posted

技术标签:

【中文标题】SWIG + setup.py:ImportError:动态模块未定义初始化函数(init_foo)【英文标题】:SWIG + setup.py: ImportError: dynamic module does not define init function (init_foo) 【发布时间】:2016-06-27 03:44:25 【问题描述】:

我正在尝试用 swig 将函数 foo 包装在 test.cpp 中。我有一个标题foo.h,其中包含函数 foo 的声明。 test.cpp 依赖于外部标头ex.h 和位于/usr/lib64 中的共享对象文件libex.so

我关注了blog post from here。

我可以使用python setup.py build_ext --inplace 构建模块。但是,当我尝试导入它时,我收到以下错误,并且我不确定我缺少什么,因为与此错误有关的大多数其他问题不使用 setup.py 文件。以下是我目前拥有的示例。

导入 _foo 的错误:

>>> import _foo

ImportError: dynamic module does not define init function (init_foo)

test.i

%module foo


%
#pragma warning(disable : 4996)
#define SWIG_FILE_WITH_INIT
#include "test.h"
%

%include <std_vector.i>
%include <std_string.i>
%include "test.h"

test.cpp

#include "ex.h"

void foo(int i)
    return;
;

test.h

#include "ex.h"

void foo(int i);

setup.py

try:
    from setuptools.command.build_ext import build_ext
    from setuptools import setup, Extension, Command
except:
    from distutils.command.build_ext import build_ext
    from distutils import setup, Extension, Command

foo_module = Extension('_foo', 
                        sources=['foo.i' , 'foo.cpp'],
                        swig_opts=['-c++'],
                        library_dirs=['/usr/lib64'],
                        libraries=['ex'],
                        include_dirs = ['/usr/include'],
                        extra_compile_args = ['-DNDEBUG', '-DUNIX', '-D__UNIX',  '-m64', '-fPIC', '-O2', '-w', '-fmessage-length=0'])

setup(name='mymodule',
      ext_modules=[foo_module],
      py_modules=["foo"],
      )

【问题讨论】:

您是否看到它生成一个包装文件,编译生成的文件并将其链接到模块中?类似于swig -python -c++ -o foo_wrap.cpp foo.igcc ... foo_wrap.cpp ...g++ ... foo_wrap.o ... 之类的内容,如引用的博文中的输出 @Thomas 是的,有一个很长/类似的输出,我稍后会发布我看到的内容。 @Thomas 这是输出,pastebin.com/MSChdNMy 嗯,看起来不错。 foo_wrap.cpp 中是否有 init_foo 方法? _foo.so 中是否有 init_foo 符号? @Thomas 回答一下,我可以奖励你奖金 【参考方案1】:

看起来foo_foo的使用有些不一致,因为包装文件是在编译和链接中生成的。

尝试更改 test.i 中的模块名称

%module foo

%module _foo

或调整 setup.py 中的扩展声明

Extension('_foo',

Extension('foo',  

【讨论】:

【参考方案2】:

我遇到了同样的错误,但这是由于使用了哪个 python。我使用的是带有 python2.7、python3.4 和 python3.5 的系统。只有“python3”(符号链接到 python3.5)有效。使用任何其他 python 导入都会出现“ImportError: dynamic module does not define init function”错误。

【讨论】:

以上是关于SWIG + setup.py:ImportError:动态模块未定义初始化函数(init_foo)的主要内容,如果未能解决你的问题,请参考以下文章

setup.py 的目的是啥? [复制]

一个关于python3中setup.py小概念

setup.py -- 私人/商业项目的配置

ez_setup.py

setup.py 的替代方案

requirements.txt 与 setup.py