Подтвердить что ты не робот

Cython скомпилировал расширение C: ImportError: динамический модуль не определяет функцию init

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

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

ImportError: dynamic module does not define init function 

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

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

4b9b3361

Ответ 1

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

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

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

Ответ 2

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

STUFF = "Hi"

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

Ответ 3

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

Ответ 4

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

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

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

В этом выводе команды я искал "init" и нашел

000000000000c0d0 (__TEXT, __ текст) внешний _initexample

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

000000000000c0a0 (__TEXT, __ текст) внешний _initmyproj

Ответ 5

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

Ответ 6

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

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

Ответ 7

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