gpt4 book ai didi

python - 在 Python 文件 Pycharm 中导入 Cython 类

转载 作者:行者123 更新时间:2023-11-30 22:58:00 29 4
gpt4 key购买 nike

如何在 pycharm python 文件中导入已编译的 cython 文件?

这是我的设置。

从我的项目根目录中,cython 类是“/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)将显示在/classes 内(通过使用 --inplace)。在 classes/__init__.py 文件中,您可以使用以下命令导入类:

from .cKNN import KNN

然后来自 test.py:

from knnextension.classes import KNN

检查其他工作 cython 扩展,like my own ,看看结构可能是什么样的(也使用 Numpy)。

关于python - 在 Python 文件 Pycharm 中导入 Cython 类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36381130/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com