2016-04-03 33 views
1

Derlenmiş bir cython dosyasını pycharm python dosyasında nasıl içe aktarılır?Python dosyasında Cython sınıfını içe aktarma Pycharm

İşte benim kurulumum.

Proje kök dizinimden, cython sınıfı "/classes/knn.cpython-35m-x86_64-linux-gnu.so" şeklindedir. Benim python dosyam "/classes/testing_cython_knn.py."

ben ... "/ sınıfları /" bir "__init __.py" dosyası var

Ancak pycharm ben alabileceğiniz bir dosya olarak ".bu" dosyasını tanımıyor. Bu dosyayı içe aktarılabilir yapmak için ne yapmam gerekiyor, bu yüzden test edebilirim?


Şu anda, başarıyla derlenmiş ve düzenli terminal tabanlı python "helloworld.so" dosyasını ithal var ... Ancak, ben tanımlanan fonksiyon pythonic işlev ... hiçbir C-şeyler oldu.

Benim Cythonic dosyasıdır:

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 

Ve setup.py:

Dynamic module does not define module export function (PyInit_knn)

:

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

Şu anda, bu bir ithalat Hata ile terminalde çalışan piton için ithalat başarısız

+0

Belki PyCharm'ı denklemden çıkarmak en iyisidir ... Python'u komut satırından çalıştırdığınızda bir ithalat yapabilir misiniz? –

+0

Tamam, terminalde python içe aktarmak için bir helloworld.so aldım. Sınıfımı aldığımda (anlayamadığın zaman, dün sthon'a bakmaya başladım), bir "importError: dinamik modül, modül dışa aktarma işlevini (PyInit_knn) tanımlamaz." – bordeo

cevap

2

Fark ettiğim ilk şey, uzantınızı yeniden adlandırmanızdır. Cython için, uzantının adı, derlenecek dosyanın adıyla uyuşmalıdır. Yani iki uzantıları ilan edilir

Dynamic module does not define module export function (PyInit_knn)

İkinci düzeltmek gerekir, ancak sadece bir dosya var (wich Numpy ihtiyacı) böylece tüm .pyx ait (tamamen * alacak bakımı birinci uzantıyı kaldırmak gerekir ya klasördeki dosyaları) veya ikinci kaldırıp birinci uzantısı 'include_dirs' direktifini entegre, bu nedenle sizin uzantıları listesini değiştirmelisiniz: Eğer .bu taşırsanız --inplace kullanırsanız

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

veya Doğru yere dosya, ithal edilecektir. Pycharm'ın orada yapacak hiçbir şeyi yoktur, hepsi Cpython'a bağlıdır, ancak, setup.py'inizde yolları doğru şekilde ayarlamak konusunda dikkatli olmalısınız. projenizin klasör yapısı gibi ise:/içeride (.bu veya .pyd)

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

paylaşılan kitaplık dosyası (--inplace kullanarak) görünecektir:

- 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 

Uzantınız demeliyim sınıflar. test.py dan sonra

from .cKNN import KNN 

ve: classes/__init__.py dosyada ile sınıfını içe olabilir

from knnextension.classes import KNN 

Kontrol diğer çalışma Cython uzantıları, like my own, yapı olabilir görmek için (yani bir tane çok Numpy kullanır).

+0

Teşekkürler adamım. Tüm bunları anlamak için çok iş olurdu. – bordeo