2016-06-10 3 views
0

Учитывая структуру каталогов:Как скомпилировать .pyx с использованием cythonize внутри setup.py

projectroot/ 
    docs/ 
    project/ 
     __init__.py 
     core/ 
      __init__.py 
      another.pyx 
      anotherone.pyx 
      lib/ 
       __init__.py 
       something.pyx 
    tests/ 
     mytest.py 
    setup.py 

И setup.py, содержащий следующее:

from Cython.Build import cythonize 

try: 
    from setuptools import Extension, setup, find_packages 
except ImportError: 
    from distutils.core import Extension, setup, find_packages 

if __name__ == '__main__': 
    setup(
     name='myproject', 
     version='1.0.0', 
     packages=find_packages(), 
     ext_modules=cythonize([ 
      Extension('*', ['project/core/lib/*.pyx']), 
      Extension('*', ['project/core/*.pyx']) 
     ]) 
    ) 

Он компилирует правильно. Единственная проблема заключается в том, что когда я открываю интерпретатор python из root directory, он вызывает ImportError.

(test) [[email protected] projectroot]# python 
>>> from project.core.lib.another import AnotherClass 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
ImportError: No module named another 

Но когда я открываю интерпретатор внутри любого другого каталога, он работает.

(test) [[email protected] projectroot/project]# python 
>>> from project.core.lib.another import AnotherClass 
# no error 

Как исправить это?

+0

Вы буквально «импортировали другую.pyx» или вы «импортировали другую»? –

+0

@NilsWerner 'import project.core.another' – Mico

+0

Созданы ли файлы .so' вообще? Кроме того, я бы рекомендовал отдельные элементы 'Extension ('project.core.lib.something', ['project/core/lib/something.pyx'])' вместо звездочек. –

ответ

1

Когда вы находитесь в корневом каталоге, сначала запускается python с локального пути, т. Е. Он просматривает проект/ядро.

Я думаю, вы, вероятно, установили пакет по всему миру (в /usr/lib/pythonx.y/dist-packages), поэтому он будет работать везде, кроме корневого каталога, потому что .so не будет присутствовать в project/core.

С любым другим текущим каталогом, python пойдет, получите .so из своей глобальной папки в /usr/lib/pythonx.y/dist-packages, где вы его установили. Чтобы использовать его локально, вам нужно сделать, например, python setup.py build_ext --inplace, или pip install -e . в корневом каталоге, как упоминал Нильс Вернер.