Cython: ImportError: нет модуля с именем myModule: как вызвать модуль cython, содержащий cimport для другого узла cython? - PullRequest
16 голосов
/ 27 марта 2012

Я пытаюсь импортировать модуль cython data.pyx в другой модуль cython user.pyx.Все компилируется нормально, но когда я пытаюсь вызвать user.pyx в модуле python, я получаю ошибку «ImportError: Нет модуля с именем data».

Все находится в одном каталоге.

package/
    __init__.py   #empty
    setup.py      
    data.pxd
    data.pyx
    user.pyx

My setup.py

from distutils.core import setup
from distutils.extension import Extension
from Cython.Distutils import build_ext


ext_modules = [
    Extension("data", ["data.pyx"]),
    Extension("user", ["user.pyx"],include_dirs = ['myPackageDir'])
    ]

setup(
  name = 'app',
  cmdclass = {'build_ext': build_ext},
  ext_modules = ext_modules  
)

Запуск следующего файла test.py вызовет ошибку.

import user     #this line raised the 'ImportError: No module named data' below
user.doSomething()

Исключение, которое я получаю:

Traceback:
 File "test.py", line 1, in <module>
    import package.user
  File "user.pyx", line 1, in init user (user.c:3384)
ImportError: No module named data

Как я могу заставить импорт работать?Спасибо за любую помощь.

Ответы [ 2 ]

14 голосов
/ 10 мая 2012

Я снова сталкиваюсь с этой проблемой в другом проекте. Чтобы решить это, вот что я сделал:

  • все import и cimport оператор должен быть полностью квалифицирован
  • весь код Python должен содержаться в rootFolder
  • setup.py должен быть на том же уровне, что и rootFolder
  • вся папка в rooFolder, включая rootFolder, должна содержать __init__.py
  • в вашем setup.py расширении include_dirs должно содержать '.'

Я создал простой проект, который иллюстрирует это здесь .
Эта страница помогла мне создать его.
Но мой проект проще, и я думаю, что он мне очень помог бы, если бы он у меня был.
Мой проект также иллюстрирует, как автоматически создавать все файлы Cython в проекте.

1 голос
/ 27 марта 2012

Я мог бы что-то упустить из-за Cython, но я думаю, что это:

import package.user
user.doSomething()
...