Cython compiled c расширение: ImportError: динамический модуль не определяет функцию init
Я только что скомпилировал часть моей библиотеки C как расширение, используя Cython, как "доказательство концепции". Мне удалось взломать код (константные проблемы correctnes и в сторону), чтобы, наконец, сделать пристройку построили.
однако, когда я попытался импортировать вновь созданное расширение, я получил следующую ошибку:
ImportError: dynamic module does not define init function
что я делаю неправильно и как это исправить?
Я использую Cythn 0.11.2 и Python 2.6.5 на Ubuntu 10.0.4
6 ответов
я обнаружил, что частой причиной этой проблемы является, при использовании файла установки distutils для компиляции кода, что .базовое имя pyx не соответствует имени расширения, e.g:
ext = Extension(name='different', sources=['cython_ext.pyx']) # Won't work
чтобы избежать проблемы, имя расширения должно быть точно таким же, в этом случае cython_ext
.
похоже, что это ошибка / функция в Cython. У меня было то же самое, но я просто добавил:--2-->
STUFF = "Hi"
в верхней части моего .pyx файл и проблема ушла. Он появляется, если нет глобальной инициализации (a cinit или установка глобальной переменной), что необходимый код инициализации не генерируется.
это очень поздний ответ - но у меня была такая же ошибка, и моя ушла, когда я использовал __cinit__
вместо __init__
. Я все еще изучаю типы расширений, поэтому в настоящее время я не знаю, почему это происходит. :) (Вы можете взглянуть на http://docs.cython.org/src/reference/extension_types.html#initialization-cinit-and-initнадеюсь, это кому-то пригодится.
аналогично поздний ответ... но я все время возвращался к этому вопросу. Это, вероятно, связано с несовпадающими именами проблема, которая Dologan адреса.
в моем случае произошло то, что я адаптировал пример, который я получил на работу, и получил module does not define init function
ошибка. Это было проверено с помощью (например)
Нм -м построить/Либ.в MacOSX-10.9-архитектуру x86_64-2.7/иметь вид myproj.так
в выходных данных этой команды я искал "init" и найдено
000000000000c0d0 (__TEXT, _ _ text) внешний _initexample
Я удалил все экземпляры "примера" из моего setup.py
а .файл pyx, но это сохранилось даже после удаления расширения из site-packages
, удаление папок сборки и dist и т. д. Я наконец-то нашел что то .cpp файл генерируется из моего .файл pyx по-прежнему ссылается на имя класса в Примере. Однажды я повторил свой setup.py
, импорт работает, и действительно .так файл включает
000000000000c0a0 (__TEXT, _ _ text) внешний _initmyproj
в настоящее время я изучаю Cython с книгой О'Рейли и столкнулся с той же проблемой. Что решило проблему для меня, так это добавление docstring в функцию.
это не работает:
def fib(int n):
cdef int i
cdef double a=0.0, b=1.0
for i in range(n):
a, b = a + b, a
return a
это работает:
def fib(int n):
'''Returns the nth Fibonacci number.'''
cdef int i
cdef double a=0.0, b=1.0
for i in range(n):
a, b = a + b, a
return a
еще один очень поздний ответ в моем случае я случайно вызвал cython в терминале, который запускал python2, пытаясь использовать сгенерированную библиотеку из терминала, который был в другой среде python, используя python3.
использование одной и той же версии python везде исправлено.