Поэтому я пытаюсь обернуть немного кода C с помощью Cython. Я прочитал читать прикладные уроки Cython по этому вопросу (1, 2), но в этих руководствах не говорится много о том, как скомпилировать код после того, как вы обернули его в Cython, и поэтому у меня есть ошибка, говорящая, что он не может найти мой C-код.
Во-первых, мой сценарий Cython («calcRMSD.pyx»):
import numpy as np
cimport numpy as np
cdef extern from "rsmd.h":
double rmsd(int n, double* x, double* y)
#rest of the code ommited
Код C, который я пытаюсь обернуть («rmsd.h»):
#include <string.h>
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
extern "C" {
// svd from lapack
void dgesvd_(char*,char*,int*,int*,double*,int*,double*,double*,int*,double*,
int*,double*,int*,int*);
}
double rmsd(int n, double* x, double* y)
{
//code omitted
}
Setup.py
from distutils.core import setup
from distutils.extension import Extension
from Cython.Distutils import build_ext
from Cython.Build import cythonize
import numpy as npsetup(
ext_modules = cythonize([Extension("calcRMSD",
sources = ["calcRMSD.pyx"],
include_dirs = [np.get_include()],
libraries = ["dgesvd"]
#extra_compile_args = ["-I."],
#extra_link_args = ["-L./usr/lib/liblapack.dylib"]
)])
)
Моя ошибка:
calcRMSD.c:269:10: fatal error: 'rsmd.h' file not found
#include "rsmd.h"
Я прочитал этот поток переполнения стека
Использование Cython для связи Python с общей библиотекой
но после этого я получаю разные ошибки. Если я пытаюсь поместить rmsd.h в исходные тексты, он говорит, что не распознает тип файла.
Это выглядит несколько многообещающе, но я не уверен, как его использовать.
Пожалуйста помоги!
Прежде всего, он должен найти включаемый файл, rsmd.h
, Вам нужно добавить путь, где этот заголовок может быть найден в include_dirs
параметр. Ошибка об отсутствующем файле должна исчезнуть.
Затем вам нужно будет добавить библиотеку, которую вы получите от компиляции этого кода на языке Си. Если это librsmd.a
ты бы добавил 'rsmd'
к libraries
параметр. Кроме того, вам может понадобиться library_dirs
параметр, который содержит путь, где эта библиотека может быть найдена.