Скомпилированное Cython расширение C: ImportError: динамический модуль не определяет функцию инициализации - PullRequest
42 голосов
/ 06 ноября 2011

Я только что скомпилировал часть своей библиотеки C как расширение, используя Cython, как «доказательство концепции». Мне удалось взломать код (за исключением проблем с исправлением и т. Д.), Чтобы наконец-то получить расширение.

Однако, когда я попытался импортировать вновь созданное расширение, я получил следующую ошибку:

ImportError: dynamic module does not define init function 

Что я делаю не так и как мне это исправить?

Я использую Cythn 0.11.2 и Python 2.6.5 в Ubuntu 10.0.4

Ответы [ 7 ]

66 голосов
/ 29 января 2014

Я обнаружил, что частой причиной этой проблемы является то, что при использовании установочного файла distutils для компиляции кода базовое имя .pyx не соответствует имени расширения, например:

ext = Extension(name='different', sources=['cython_ext.pyx']) # Won't work

Во избежание проблемы имя расширения должно быть точно таким же, в данном случае, cython_ext.

24 голосов
/ 20 декабря 2012

Похоже, что это ошибка / особенность в Cython.У меня было то же самое, но я просто добавил:

STUFF = "Hi"

в начало моего файла .pyx, и проблема исчезла.Появляется, если нет глобальной инициализации ( cinit или установка глобальной переменной), что требуемый код инициализации не генерируется.

3 голосов
/ 03 декабря 2012

Это очень поздний ответ - но у меня была та же самая ошибка, и моя ушла, когда я использовал __cinit__ вместо __init__.Я все еще размышляю о типах расширений, поэтому в настоящее время я не знаю, почему это происходит.:) (Вы можете взглянуть на http://docs.cython.org/src/reference/extension_types.html#initialization-cinit-and-init) Надеюсь, это кому-нибудь пригодится.

1 голос
/ 15 апреля 2018

Другой действительно поздний ответ в моем случае, я случайно вызвал cython в терминале, на котором работал python2, при попытке использовать сгенерированную библиотеку из терминала, который был в другой среде python, используя python3.

Использование одной и той же версии Python везде исправило это.

0 голосов
/ 15 ноября 2018

У меня была та же ошибка, и она была устранена путем запуска основного сценария .py в режиме «Выполнить на выделенной консоли».Доступно в Инструменты - Настройки - Выполнить.

0 голосов
/ 21 января 2018

Это решается добавлением строки документации в ваши функции.

0 голосов
/ 11 июня 2014

Точно так же поздний ответ ... но я продолжал искать свой путь, в частности, к этому вопросу.Вероятно, это связано с проблемой несоответствия имен, к которой обращается Дологан.

В моем случае произошло то, что я адаптировал пример, который я получил для работы, и получил ошибку module does not define init function.Это было проверено с помощью (например)

нм -m build / lib.macosx-10.9-x86_64-2.7 / myproj.so

В результатах этой команды я искалдля 'init' и найдено

000000000000c0d0 (__TEXT, __ text) external _initexample

Я удалил все экземпляры 'example' из моего setup.py и файла .pyx, но это сохранялось даже после удаления расширения из site-packages, удаления папок build и dist и т. д. В конце концов я обнаружил, что файл .cpp, сгенерированный из моего файла .pyx, все еще ссылается на имя класса в примере.Как только я перезапустил свой setup.py, импорт работает, и, действительно, .so файл включает

000000000000c0a0 (__TEXT, __ текст) external _initmyproj

...