【问题标题】:Cython attemps to compile twice, and failsCython 尝试编译两次,但失败了
【发布时间】:2018-05-21 11:36:50
【问题描述】:

我有一个setup.py 文件,与此处显示的文件非常相似:https://stackoverflow.com/a/49866324/4080129。它看起来像这样:

from distutils.core import setup, Extension
from Cython.Build import cythonize
import numpy

sources = ["hs/subfolder/detect.pyx",
           "hs/subfolder/Donline.cpp",
           "hs/subfolder/Handler.cpp",
           "hs/subfolder/Process.cpp",
           "hs/subfolder/Filter.cpp",
           "hs/subfolder/Localize.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
    subfolder/
        detect.pyx
        Donline.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/subfolder -I/[...]/python3.6/site-packages/numpy/core/include -I/[...]/python3.6/site-packages/numpy/core/include -I/[...]/include -I/disk/scratch/miniconda/envs/my_default/include/python3.6m -c Donline.cpp -o build/temp.linux-x86_64-3.6/Donline.o -std=c++11 -O3
gcc: error: Donline.cpp: No such file or directory
gcc: fatal error: no input files
compilation terminated.
error: command 'gcc' failed with exit status 4

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

【问题讨论】:

  • 请分享安装脚本,如果您提供磁盘上的项目结构(什么目录中的文件,无内容),也会有所帮助。
  • 完成。谢谢!
  • 安装脚本在我看来不错,也无法重现该问题。也许做一个干净的重建? python setup.py clean build 或删除 build/ 目录。错误还在吗?
  • 是的,我已经试过了。
  • 我也刚刚尝试not使用virtualenv,它是一样的。这真的很奇怪。会不会是 C 文件互相调用?还是 init 文件有问题?我想不出一个理由...

标签: python compilation cython setup.py


【解决方案1】:

原来.pyx 文件包含一行

# distutils: sources = Donline.cpp Handler.cpp Process.cpp Filter.cpp Localize.cpp

告诉 distutils 编译什么。我不知道它,因为它看起来很像注释掉的行,所以我没有意识到它在那里。

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-01-19
    • 1970-01-01
    • 2021-10-07
    • 2014-09-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多