Cython尝试编译两次,但失败

时间:2018-05-21 11:36:50

标签: python compilation cython setup.py

我有一个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

我很困惑,这完全阻止了我的代码编译...

1 个答案:

答案 0 :(得分:6)

事实证明.pyx文件包含一行

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

告诉distutils编译什么。我不知道它,因为它看起来非常像一条注释掉的线,我没有意识到它就在那里。

Cython尝试编译这些,而不是setup.py文件中包含的那些,即两个源列表中的任何一个都不会覆盖另一个。显然,这些源虽然被列在子文件夹中的pyx文件中,但预计会在相对于setup.py文件所在的文件的路径中,或者可能相对于文件夹I&m; m从中调用python。

无论如何,删除该行解决了这个问题。