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 везде исправлено.