Cython编译失败:setup.py重复编译无路径文件报错求助
解决distutils编译子目录Cython/C++文件时的路径错误问题
我之前处理过几乎一模一样的场景,你的问题主要来自两个容易被忽略的配置点:模块名称与目录结构不匹配,以及未明确指定C++编译环境。下面是一步步的修复方案:
问题根源分析
- 模块名称与目录不匹配:你的Extension命名为
hs.detect,但源文件实际在hs/subfolder/下,distutils会误以为模块直接在hs/根目录,编译时错误地剥离源文件的路径前缀,导致找不到Donline.cpp这类文件。 - 未指定C++编译语言:你包含了多个C源文件,但没有告诉distutils使用C编译器,它默认用gcc处理cpp文件,这不仅会引发路径解析问题,还会导致C++语法编译失败。
修复后的setup.py代码
from distutils.core import setup, Extension from Cython.Build import cythonize import numpy import os # 获取setup.py所在目录的绝对路径,避免相对路径解析出错 base_dir = os.path.dirname(os.path.abspath(__file__)) # 用绝对路径构建所有源文件路径 sources = [ os.path.join(base_dir, "hs/subfolder/detect.pyx"), os.path.join(base_dir, "hs/subfolder/Donline.cpp"), os.path.join(base_dir, "hs/subfolder/Handler.cpp"), os.path.join(base_dir, "hs/subfolder/Process.cpp"), os.path.join(base_dir, "hs/subfolder/Filter.cpp"), os.path.join(base_dir, "hs/subfolder/Localize.cpp") ] # 修正Extension配置:匹配目录的模块名 + 指定C++语言 exts = [ Extension( name='hs.subfolder.detect', # 模块名必须对应实际目录结构 sources=sources, extra_compile_args=['-std=c++11', '-O3'], include_dirs=[numpy.get_include()], language='c++' # 关键:告诉distutils用C++编译器 ) ] setup( ext_modules=cythonize(exts), include_dirs=[numpy.get_include()] )
额外优化(可选)
如果希望安装后能直接用import hs.detect而非import hs.subfolder.detect,只需在hs/__init__.py中添加一行导入:
from .subfolder.detect import *
编译测试
推荐用以下命令编译,会把生成的共享库直接放在源文件目录,方便快速测试:
python setup.py build_ext --inplace
这样修改后,distutils就能正确识别所有源文件的路径,调用g编译C代码,不会再出现找不到文件的错误了。
内容的提问来源于stack exchange,提问作者Martino
相关产品推荐
相关产品推荐

