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.

Во всяком случае, удаление линии решило проблему.