2016-04-03 33 views
1

Wie importiert man eine kompilierte Cython-Datei in eine Pycharm-Python-Datei?Cython-Klasse in Python-Datei importieren Pycharm

Hier ist mein Setup.

Von meinem Projektstammverzeichnis ist die Cython-Klasse "/classes/knn.cpython-35m-x86_64-linux-gnu.so." Meine Python-Datei lautet "/classes/testing_cython_knn.py".

Ich habe eine "__init __.py" Datei in "/ classes /" ...


jedoch PyCharm erkennt nicht die ".so" Datei als eine Datei, die ich importieren. Was muss ich tun, um diese Datei zum Importieren verfügbar zu machen, damit ich sie testen kann?


Derzeit habe ich eine "helloworld.so" Datei in regelmäßigen, terminalbasierten Python ... aber erfolgreich kompiliert und importiert die Funktion I definiert war eine pythonic Funktion ... kein C-Material.

Meine Cythonic Datei ist:

import numpy as np 
cimport numpy as np 


from scipy.stats import mode 
from scipy.spatial.distance import cdist 
from threading import Thread 



cdef class KNN: 
    cdef public int k 
    cdef public str metric 
    cdef public np.ndarray trainingX 
    cdef public np.ndarray trainingY 
    cdef public np.ndarray predict(self,np.ndarray X): 
     cdef np.ndarray distances,predicted_classes,sorted_distance_indices 

     distances = cdist(X,self.trainingX,metric=self.metric) 
     predicted_classes = np.zeros(X.shape[0],dtype=np.float64) 
     sorted_distance_indices = np.argpartition(distances,self.k,axis=1)[:,:self.k] 
     predicted_classes,_ = mode(self.trainingY[sorted_distance_indices]) 
     return predicted_classes 

Und setup.py:

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


extensions = [ 
    Extension("knn",["cKNN.pyx"]), 
    Extension("*",["*.pyx"],include_dirs=[numpy.get_include()])] 

setup(ext_modules = cythonize(extensions),include_dirs=[numpy.get_include()]) 

Derzeit dies nicht auf Import Python auf dem Terminal mit einem Importfehler ausgeführt wird:

Dynamic module does not define module export function (PyInit_knn)

+0

Vielleicht ist es am besten, zuerst PyCharm aus der Gleichung zu entfernen ... können Sie einen Import durchführen, wenn Sie Python von der Kommandozeile ausführen? –

+0

Ok, ich habe eine Helloworld.so in Python auf dem Terminal zu importieren. Wenn ich meine Klasse importiere (für den Fall, dass Sie es nicht sagen können, habe ich gestern angefangen, in Cython zu suchen), bekomme ich einen "ImportError: dynamisches Modul definiert keine Modul-Export-Funktion (PyInit_knn)." – bordeo

Antwort

2

Das erste, was mir auffällt, ist, dass Sie Ihre Erweiterung umbenennen. Bei Cython muss der Name der Erweiterung mit dem Namen der zu kompilierenden Datei übereinstimmen. Das sollte die

Dynamic module does not define module export function (PyInit_knn)

Zweite beheben, werden Sie zwei Erweiterungen zu erklären, aber Sie haben nur eine Datei (Wich braucht Numpy), so sollten Sie entweder die erste Erweiterung vollständig entfernen (die * kümmert sich um all die .pyx Dateien im Ordner) oder die zweite entfernen und die ‚include_dirs‘ Richtlinie zur ersten Erweiterung integrieren, so sollten Sie Ihre Erweiterungen Liste ändern: wenn Sie --inplace

extensions = [ 
    Extension("cKNN",["cKNN.pyx"],include_dirs=[numpy.get_include()])] 

verwenden oder wenn Sie die .so bewegen Datei an der richtigen Stelle, wird importiert. Pycharm hat nichts zu tun, es liegt alles an Cpython, aber in Ihrer setup.py müssen Sie vorsichtig sein, um die Pfade richtig zu setzen. Wenn Ihr Projekt Ordnerstruktur ist wie:

- knnProject (this opens in Pycharm) 
- - knnextension 
- - - classes 
- - - - __init__.py 
- - - - cKNN.pyx 
- - - __init__.py (this is required to do module import from /classes) 
- - setup.py 
- - test.py 

sollte Ihre Erweiterung sagen:

extensions = [ 
     Extension("knnextension/classes/cKNN",["knnextension/classes/cKNN.pyx"],include_dirs=[numpy.get_include()])] 

Die gemeinsam genutzte Bibliotheksdatei (.so oder .pyd) wird angezeigt (von --inplace verwenden) innen/Klassen. In der classes/__init__.py Datei können Sie die Klasse importieren mit:

from .cKNN import KNN 

und dann von test.py:

from knnextension.classes import KNN 

prüfen andere Arbeits cython Erweiterungen, like my own, um zu sehen, wie sich die Struktur (dass man sein könnte benutzt auch Numpy).

+0

Danke Mann. Das wäre eine Menge Arbeit gewesen, um das herauszufinden. – bordeo