2016-04-03 32 views
1

pycharmのpythonファイルにコンパイル済みのcythonファイルをインポートするにはどうすればよいですか?PythonファイルのCythonクラスをインポートするPycharm

これは私の設定です。

私のプロジェクトのルートディレクトリから、cythonクラスは "/classes/knn.cpython-35m-x86_64-linux-gnu.so"です。私のpythonファイルは "/classes/testing_cython_knn.py"です。

私はしかし、Pycharmは私がインポートできるファイルとして ".soは" ファイルを認識しない


... "/クラス/" で "__init __.py" ファイルを持っています。このファイルをインポートできるようにするためには何が必要なのですか?テストすることができますか?


現在、私は正常にコンパイルし、定期的に、端末ベースのpythonで「helloworld.so」ファイルをインポートしている...しかし、私は定義された関数は、ニシキヘビ機能...ないC-ものでした。

私Cythonicファイルは次のとおりです。

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 

そして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()]) 

現在のところ、これはインポートエラーと端末上で実行されているのpythonへのインポートに失敗します

+0

おそらく最初に式からPyCharmを削除するのが最善です...コマンドラインからPythonを実行するときにインポートを実行できますか? –

+0

私はhelloworld.soを持っていて、ターミナルでPythonでインポートします。私がクラスをインポートしたときに(昨日cythonを調べ始めたばかり)、importError:動的モジュールがモジュールのエクスポート関数(PyInit_knn)を定義していません。 – bordeo

答えて

2

最初に気づくのは、あなたの内線番号の名前を変更することです。 Cythonの場合、拡張子の名前はコンパイルするファイルの名前と対応していなければなりません。それは

Dynamic module does not define module export function (PyInit_knn)

セカンドを修正する必要があり、あなたは2つの拡張を宣言しているが、1つのファイルだけ(ウィッヒはnumpyのを必要とします)を持っているので、あなたは完全に最初の拡張子を削除する必要がありますいずれか(*すべての.pyxの世話をしますフォルダ内のファイル)または第二を削除し、あなたがあなたの拡張機能のリストを変更する必要がありますので、最初の拡張子に「include_dirs」ディレクティブを統合:あなたは--inplaceを使用する場合、または.soのを移動した場合

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

適切な場所にファイルがあれば、インポートされます。 Pycharmはそこで何もすることはありません、それはCpythonに任されていますが、あなたのsetup.pyではパスを適切に設定することに注意する必要があります。プロジェクトのフォルダ構造が似ている場合:/内部(の.soまたは.pyd)

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

共有ライブラリファイルを(--inplaceを使用して)表示されます:

- 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 

あなたの拡張子が言うべきクラス。 test.pyから、その後

from .cKNN import KNN 

と::他の作業cython拡張子

from knnextension.classes import KNN 

チェック、like my own、構造があるかもしれない方法を確認するには(その1あなたが持つクラスをインポートすることができclasses/__init__.pyファイルでナンシーも使用する)。

+0

ありがとうございます。それはそれをすべて把握するための多くの作業でした。 – bordeo

関連する問題