Cython пытается скомпилировать дважды, и не удается - PullRequest
0 голосов
/ 21 мая 2018

У меня есть файл setup.py, который очень похож на файл, показанный здесь: https://stackoverflow.com/a/49866324/4080129. Он выглядит так:

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

I'mочень смущает, это полностью мешает компиляции моего кода ...

1 Ответ

0 голосов
/ 03 июня 2018

Оказывается, файл .pyx содержит строку

# distutils: sources = SpkDonline.cpp SpikeHandler.cpp ProcessSpikes.cpp FilterSpikes.cpp LocalizeSpikes.cpp

, которая сообщает distutils, что компилировать.Я не знал об этом, и, поскольку он очень похож на закомментированную строку, я не осознавал, что он там был.

Cython пытается скомпилировать также эти,кроме тех, которые содержатся в файле setup.py, т.е. ни один из двух источников не переопределяет другой.Очевидно, что эти источники, несмотря на то, что они перечислены в файле pyx, который находится во вложенной папке, должны находиться в путях относительно файла, в котором находится файл setup.py, или, возможно, относительно папки, из которой я вызываю python.

В любом случае удаление строки решило проблему.

...