2016-06-10 11 views
0

eine Verzeichnisstruktur Gegeben:So übersetzen .pyx mit cythonize innerhalb setup.py

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

Und setup.py folgendes enthält:

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']) 
     ]) 
    ) 

Es kompiliert einwandfrei. Das einzige Problem ist, dass, wenn ich den Python-Interpreter von der root directory öffne, es eine ImportError wirft.

(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 

Aber wenn ich den Interpreter in einem anderen Verzeichnis öffnen, funktioniert es.

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

Wie kann ich das beheben?

+0

hast du wörtlich "another.pyx" importiert oder "ein anderes importiert"? –

+0

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

+0

Werden die' .so' Dateien überhaupt erzeugt? Außerdem würde ich einzelne 'Extension ('project.core.lib.something', ['project/core/lib/something.pyx'])' Einträge anstelle von Sternchen empfehlen. –

Antwort

1

Wenn Sie sich im Stammverzeichnis befinden, versucht Python zuerst vom lokalen Pfad zu importieren, d. H. Es wird in das Projekt/den Kern hineingeschaut.

Ich denke, Sie haben das Paket wahrscheinlich global installiert (in /usr/lib/pythonx.y/dist-packages), so dass es überall außer im Stammverzeichnis funktioniert, weil die .so in project/core nicht vorhanden sein wird.

Mit jedem anderen aktuellen Verzeichnis, Python wird die .so von seinem globalen Ordner in /usr/lib/pythonx.y/dist-packages erhalten, wo Sie es installiert haben. Um es lokal zu verwenden, müssen Sie zum Beispiel python setup.py build_ext --inplace oder pip install -e . im Stammverzeichnis tun, wie Nils Werner erwähnte.