在 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)。