Cython пытается скомпилировать дважды и не работает
У меня есть файл setup.py
который очень похож на тот, который показан здесь: qaru.site/info/15517244/.... Это выглядит так:
from distutils.core import setup, Extension
from Cython.Build import cythonize
import numpy
sources = ["hs/detection_localisation/detect.pyx",
"hs/detection_localisation/SpkDonline.cpp",
"hs/detection_localisation/SpikeHandler.cpp",
"hs/detection_localisation/ProcessSpikes.cpp",
"hs/detection_localisation/FilterSpikes.cpp",
"hs/detection_localisation/LocalizeSpikes.cpp"]
exts = [Extension(name='hs.detect',
sources=sources,
extra_compile_args=['-std=c++11', '-O3'],
include_dirs=[numpy.get_include()])]
setup(
ext_modules=cythonize(exts),
include_dirs=[numpy.get_include()]
)
Там есть пакет с чистым Python и подмодуль, содержащий файлы Cython. setup.py
находится в родительской папке, а не в Cython:
setup.py
hs/
some_python.py
detection_localisation/
detect.pyx
SpkDonline.cpp
...etc
Теперь setup.py правильно компилирует все файлы module/submodule/file1.cpp
и т.д. И сохраняет сборку для build/temp.linux-x86_64-3.6/module/submodule/file1.o
. Однако сразу после этого он пытается скомпилировать файл с именем file1.cpp
, который не существует (правильный - это module/submodule/file1.cpp
и уже скомпилирован).
gcc -pthread -Wno-unused-result -Wsign-compare -DNDEBUG -g -fwrapv -O3 -Wall -Wstrict-prototypes -fPIC -Ihs/detection_localisation -I/disk/scratch/mart/Clustering/HS2/HS2venv/lib/python3.6/site-packages/numpy/core/include -I/disk/scratch/mart/Clustering/HS2/HS2venv/lib/python3.6/site-packages/numpy/core/include -I/disk/scratch/martino/Clustering/HS2/HS2venv/include -I/disk/scratch/miniconda/envs/my_default/include/python3.6m -c SpkDonline.cpp -o build/temp.linux-x86_64-3.6/SpkDonline.o -std=c++11 -O3
gcc: error: SpkDonline.cpp: No such file or directory
gcc: fatal error: no input files
compilation terminated.
error: command 'gcc' failed with exit status 4
Я очень смущен, это полностью предотвращает компиляцию моего кода...
Ответы
Ответ 1
Оказывается, файл .pyx
содержит строку
# distutils: sources = SpkDonline.cpp SpikeHandler.cpp ProcessSpikes.cpp FilterSpikes.cpp LocalizeSpikes.cpp
который рассказывает distutils, что компилировать. Я не знал об этом, и, поскольку он выглядит очень много, как прокомментированная строка, я не понимал, что это было.
Cython пытается также скомпилировать эти, кроме тех, которые содержатся в файле setup.py
, то есть ни один из двух списков источников не переопределяет другой. По-видимому, эти источники, несмотря на то, что они перечислены в файле pyx, который находится во вложенной папке, как ожидается, находятся в пути относительно файла, в котором находится файл setup.py
, или, возможно, относительно папки, из которой я вызываю python.
Во всяком случае, удаление линии решило проблему.