2017-02-14 5 views
1

i recht neu bin Cython, weiß jemand, wie ein Python-Projekt über Cython zu kompilieren (mit relativ geringer Overhead), da ich die folgenden Importfehler werden immer:compling Python-Paket über Cython

ImportError: No module named CythonRelated.testSource.MyClassObject

Mein Testprojektstruktur ist wie folgt:

CythonRelated/ 
      setup.py 
      testSource/ 
        MainCythonTest.py 
        MyClassObject.py 
        MainCythonTest.pyx 
        MyClassObject.pyx 

Wo MainCythonTest Einfuhren Klasse von MyClassObject Modul (via

from CythonRelated.testSource.MyClassObject import myCustomObj

), initialisiert ein Objekt und ruft eine Objektmethode auf.

sieht mein setup.py wie folgt aus:

from distutils.core import setup 
from Cython.Build import cythonize 
from distutils.extension import Extension 

setup(
    name = "My cython test app", 
    ext_modules = cythonize("testSource/*.pyx", include_path = ["."]), 
    packages = ["CythonRelated", "CythonRelated.testSource"] 
) 

Was bin ich?

Unter setup.py außerhalb CythonRelated (und natürlich den entsprechenden Pfad von * .pyx Dateien in cythonize Aktualisierung) nicht helfen, entweder

MyClassObject.py

import sys 
print sys.version_info 

class myCustomObj(): 
    def __init__(self, value): 
     self.value_ = value 

    def classInfo(self): 
     print "calling class {0} object with value of {1}".format(self.__class__.__name__, 
                    self.value_) 

MainCythonTest.py

import pyximport; pyximport.install() 

from CythonRelated.testSource.MyClassObject import myCustomObj 

def myFunc(): 

    aObj = myCustomObj(12) 

    bObj = myCustomObj(21) 

    bObj.classInfo() 

    aObj.classInfo() 

    print "myFunc called" 

myFunc() 

Antwort

0

Sie müssen sich bewegen die setup.py Datei sowieso, da es nicht Teil eines Projekts sein kann, dass es "kompiliert".

Dann ist das Hauptproblem, dass Sie __init__.py Dateien in CythonRelated und CythonRelated/testSource fehlen. Ohne diese Datei ist das Verzeichnis kein importierbares Python-Modul. Mit diesen beiden Änderungen konnte ich pip install --user -e . das Paket und auch das Programm MainCythonTest.py

+0

Danke - aber dann scheint es, dass Python nicht die kompilierten Versionen dauert. Versuchen Sie, die .py-Dateien zu entfernen und nur mit .pyx zu installieren. Sie können die Module nicht finden, wenn Sie sie importieren (obwohl die Installation fehlerfrei verläuft). Oder müssen Sie die .py-Dateien immer behalten? Wie können Sie sicher sein, dass es dann die kompilierte Version nimmt? Ich sah das: http://Stackoverflow.com/questions/6584457/what-is-the-precedence-of-python-compiled-files-in-imports aber irgendwie ... – schmi

+0

Ok, ich habe das nicht verstanden. Ich habe nur den Inhalt für die '.pyx' Datei kopiert. Wenn Sie eine '.py'-Datei" cythonisieren ", muss die' .py'-Datei nicht beibehalten werden. Sie können es einfach entfernen. –