2014-11-29 2 views
2

После файла в helloworld.pyx:Cython ImportError или ошибка пути

print("Hello World") 

После файла в setup.py:

from distutils.core import setup 
from distutils.extension import Extension 
from Cython.Distutils import build_ext 
ext_modules = [Extension("helloworld",["helloworld.pyx"] 
setup(
    name = 'HW', 
    cmdclass = {'build_ext': build_ext}, 
    ext_modules = ext_modules 
) 

После того, как я использую python setup.py build_ext --inplace я получил мой * .so файл

Итак, я переименую * .so в hw.so, для получения более короткого имени импорта.

Но если я сарт python и введите: import hw я получил эту ошибку:

ImportError: dynamic module does not define init function (PyInit_hw) 

я делал точную вещь бой 3 часа назад, и все было нормально. Но я судимое что-то с этой стороны: http://sourceforge.net/p/ubertooth/mailman/message/31699880/

I судимое следующее:

cmake -DPYTHON_EXECUTABLE=$(which python2) \ 
-DPYTHON_INCLUDE_DIR=$(echo /usr/include/python2*) \ 
-DPYTHON_LIBRARY=$(echo /usr/lib/libpython2.*.so) \ 

, потому что я хотел что-то исправить. Я заменил все «2» на «3», потому что я работаю с python3.4

После того, как я сделал это, я всегда получал ошибку выше. Я уничтожил какой-то путь? Как я могу его отменить? Спасибо и за помощь

Артур

Извините за мой плохой английский: P

ответ

2

При просмотре документации Python 3 на "Расширение Python с C или C++" мы видим, что

The initialization function must be named PyInit_name(), where name is the name of the module, and should be the only non-static item defined in the module file.

Это означает, что мы не можем просто изменить имя файла модуля без изменения функции init. Сначала мы должны скомпилировать модуль с окончательным именем. Переименование файла .so после его компиляции не будет работать.

+0

Большое спасибо, я заметил это, попробовав себя. Но для ссылки на документацию я не нашел этого statemant. Было бы спасено несколько часов исследований проб и ошибок: P – Speedy

Смежные вопросы