SWIG教程问题

SWIG tutorial problems

本文关键字:问题 教程 SWIG      更新时间:2023-10-16

我正在尝试遵循swig教程,但我卡住了,现在我正在使用:

  • Python 3.5.1 (v3.5.1:37a07cee5969, Dec 6 2015, 01:54:25) [MSC v.1900 64 bit (AMD64)] on win32
  • Vs2015 x64, Microsoft (R) C/c++优化编译器版本19.00.23918 for x64
  • SWIG版本3.0.10

内容如下:

example.c

 #include <time.h>
 double My_variable = 3.0;
 int fact(int n) {
     if (n <= 1) return 1;
     else return n*fact(n-1);
 }
 int my_mod(int x, int y) {
     return (x%y);
 }
 char *get_time()
 {
     time_t ltime;
     time(&ltime);
     return ctime(&ltime);
 }

的例子

 %module example
 %{
 /* Put header files here or function declarations like below */
 extern double My_variable;
 extern int fact(int n);
 extern int my_mod(int x, int y);
 extern char *get_time();
 %}
 extern double My_variable;
 extern int fact(int n);
 extern int my_mod(int x, int y);
 extern char *get_time();

然后我做:

  • swig -python example.i
  • cl /D_USRDLL /D_WINDLL example.c example_wrap.c -Ic:Python351include /link /DLL /out:example.pyd /libpath:c:python351libs python35.lib

但是当我尝试python -c "import example"时,我得到:

Traceback (most recent call last):
  File "<string>", line 1, in <module>
ImportError: dynamic module does not define module export function (PyInit_example)

问题,发生了什么,我怎么解决它?

SWIG的动态链接模块的名称应该以下划线开头,在本例中为_example.pyd。SWIG生成的Python文件正在查找名为_example的模块,请参见该文件的开头:

from sys import version_info
if version_info >= (2, 6, 0):
    def swig_import_helper():
        from os.path import dirname
        import imp
        fp = None
        try:                                           # ↓ SEE HERE
            fp, pathname, description = imp.find_module('_example', [dirname(__file__)])
        except ImportError:
            import _example # ← AND HERE
            return _example # ← AND HERE
        if fp is not None:
            try:                      # ↓ AND HERE
                _mod = imp.load_module('_example', fp, pathname, description)
            finally:
                fp.close()
            return _mod
    _example = swig_import_helper() # ← AND HERE
    del swig_import_helper
else:    # ↓ AND HERE
    import _example

它实际上是由SWIG包装的c++模块的名称。