在 Python 文件 Pycharm 中导入 Cython class
Import Cython class in Python file Pycharm
如何在 pycharm python 文件中导入已编译的 cython 文件?
这是我的设置。
在我的项目根目录中,cython class 是“/classes/knn.cpython-35m-x86_64-linux-gnu.so”。我的 python 文件是“/classes/testing_cython_knn.py。”
我在“/classes/”中有一个“__init __.py”文件...
但是,Pycharm 无法将“.so”文件识别为我可以导入的文件。我需要做什么才能使此文件可以导入,以便我可以对其进行测试?
目前,我已经在基于终端的常规 python 中成功编译并导入了一个 "helloworld.so" 文件...但是,我定义的函数是一个 pythonic 函数。 ..没有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:
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 运行 失败,出现导入错误:
Dynamic module does not define module export function (PyInit_knn)
我注意到的第一件事是您正在重命名您的扩展程序。对于 Cython,扩展名必须与要编译的文件名相对应。那应该修复
Dynamic module does not define module export function (PyInit_knn)
其次,您声明了两个扩展名,但您只有一个文件(需要 Numpy),因此您应该完全删除第一个扩展名(* 将处理文件夹中的所有 .pyx 文件)或删除第二个并将 'include_dirs' 指令集成到第一个扩展,因此您应该将扩展列表更改为:
extensions = [
Extension("cKNN",["cKNN.pyx"],include_dirs=[numpy.get_include()])]
如果您使用 --inplace 或者如果您将 .so 文件移动到正确的位置,它将被导入。 Pycharm 与那里无关,这完全取决于 Cpython,但是,在您的 setup.py 中,您必须小心正确设置路径。如果您项目的文件夹结构如下:
- 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
您的分机应该说:
extensions = [
Extension("knnextension/classes/cKNN",["knnextension/classes/cKNN.pyx"],include_dirs=[numpy.get_include()])]
共享库文件(.so 或 .pyd)将显示(通过使用 --inplace)在 /classes 中。在 classes/__init__.py
文件中,您可以使用以下方式导入 class:
from .cKNN import KNN
然后从 test.py:
from knnextension.classes import KNN
检查其他可用的 cython 扩展,like my own,看看结构可能如何(那个也使用 Numpy)。
如何在 pycharm python 文件中导入已编译的 cython 文件?
这是我的设置。
在我的项目根目录中,cython class 是“/classes/knn.cpython-35m-x86_64-linux-gnu.so”。我的 python 文件是“/classes/testing_cython_knn.py。”
我在“/classes/”中有一个“__init __.py”文件...
但是,Pycharm 无法将“.so”文件识别为我可以导入的文件。我需要做什么才能使此文件可以导入,以便我可以对其进行测试?
目前,我已经在基于终端的常规 python 中成功编译并导入了一个 "helloworld.so" 文件...但是,我定义的函数是一个 pythonic 函数。 ..没有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:
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 运行 失败,出现导入错误:
Dynamic module does not define module export function (PyInit_knn)
我注意到的第一件事是您正在重命名您的扩展程序。对于 Cython,扩展名必须与要编译的文件名相对应。那应该修复
Dynamic module does not define module export function (PyInit_knn)
其次,您声明了两个扩展名,但您只有一个文件(需要 Numpy),因此您应该完全删除第一个扩展名(* 将处理文件夹中的所有 .pyx 文件)或删除第二个并将 'include_dirs' 指令集成到第一个扩展,因此您应该将扩展列表更改为:
extensions = [
Extension("cKNN",["cKNN.pyx"],include_dirs=[numpy.get_include()])]
如果您使用 --inplace 或者如果您将 .so 文件移动到正确的位置,它将被导入。 Pycharm 与那里无关,这完全取决于 Cpython,但是,在您的 setup.py 中,您必须小心正确设置路径。如果您项目的文件夹结构如下:
- 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
您的分机应该说:
extensions = [
Extension("knnextension/classes/cKNN",["knnextension/classes/cKNN.pyx"],include_dirs=[numpy.get_include()])]
共享库文件(.so 或 .pyd)将显示(通过使用 --inplace)在 /classes 中。在 classes/__init__.py
文件中,您可以使用以下方式导入 class:
from .cKNN import KNN
然后从 test.py:
from knnextension.classes import KNN
检查其他可用的 cython 扩展,like my own,看看结构可能如何(那个也使用 Numpy)。