2016-06-10 76 views
0

給定的目錄結構cythonize:如何編譯.pyx使用內部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']) 
     ]) 
    ) 

編譯正確。唯一的問題是當我打開root directory的python解釋器時,它會產生一個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首先嚐試從本地路徑導入,即它在project/core中查找。

我想你可能已經在全局安裝了軟件包(在/usr/lib/pythonx.y/dist-packages),所以它可以在除根目錄以外的任何地方工作,因爲.so不會出現在project/core中。

在任何其他當前目錄中,python將從其全局文件夾/usr/lib/pythonx.y/dist-packages中獲取.so,在其中安裝它。 要在本地使用它,您需要在Nils Werner提到的根目錄中執行例如python setup.py build_ext --inplacepip install -e .