swig и python3: лишнее подчеркивание

Используя swig 2.0.8 и python 3.2, работает

swig -python -modern -py3 -o mymodule_wrap.c mymodule.i

создает файл-оболочку, который

#  define SWIG_init    PyInit__mymodule

там (обратите внимание на два подчеркивания между PyInit и mymodule).

Импорт не работает с

python3 -c "import mymodule"
Traceback (most recent call last):
   File "<string>", line 1, in <module>
ImportError: dynamic module does not define init function (PyInit_mymodule)

(обратите внимание на одно подчеркивание).

Удаление подчеркивания вручную в mymodule_wrap.c и перекомпиляция приводит к рабочему модулю.

В этом вопросе: SWIG и ошибка импорта Python3 интерпретатор python пожаловался на то, что не нашел PyInit__module.

Что случилось?


person thias    schedule 11.09.2012    source источник


Ответы (1)


Убедитесь, что модуль расширения называется _mymodule.pyd, а не mymodule.pyd.

Объяснение:

Учитывая файл SWIG .i, содержащий объявление:

%module mymodule

SWIG сгенерирует два файла:

  • моймодуль.py
  • mymodule_wrap.c

mymodule.py импортируется в Python через import mymodule и загружает _mymodule.pyd.

mymodule_wrap.c содержит функцию точки входа PyInit__mymodule. Этот исходный файл должен быть связан с окончательным файлом _mymodule.pyd.

Оператор Python import <module> ищет:

  1. <module>.pyd с точкой входа PyInit_<module>.
  2. <module>.py.

Для расширения, сгенерированного SWIG, import mymodule будет загружать mymodule.py, который загружает _mymodule.pyd и правильно ищет PyInit__mymodule.

Если используется неправильное имя расширения, import mymodule загрузит mymodule.pyd и будет неправильно искать PyInit_mymodule.

person Mark Tolonen    schedule 11.09.2012
comment
Спасибо! Я использовал distutils, и изменение имени расширения в ext_modules=[ Extension('mymodule')] на ext_modules=[ Extension('_mymodule')] решило мою проблему. - person thias; 12.09.2012