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
Ответы
Ответ 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 в режиме "Выполнить на выделенной консоли". Доступно в Инструменты - Настройки - Выполнить.