Cython/C++ - PXD文件中的头文件路径

1 投票
1 回答
819 浏览
提问于 2025-04-17 19:20

我有一个项目,里面有几个Cython模块,分布在不同的文件夹里:

clibs
  File.cpp
  File.hpp
module
  module/folder
    __init__.py
    file1.pyx
    file1.pxd
  __init__.py
  file2.pyx

module/folder/file1.pxd里,我有这样的内容:

cdef extern from "../../clibs/File.hpp":
    cdef cppclass MyCppClass:
        int _data
        MyCppClass(int arg)

cdef class MyPyClass:
    cdef MyCppClass* cpp_obj

然后在module/file2.pyx中,我使用cimportmodule/folder/file1.pxd引入了这些声明:

from module.folder.file1 cimport MyCppClass, MyPyClass

现在,当我尝试构建这个项目时,Cython会生成一行代码:

#include "../../clibs/File.hpp"

在读取module/folder/file1.pxd时,它把这个路径放到了新生成的module/file2.cpp里,这显然是个无效的路径!

我该怎么解决这个问题呢?我可以在我的extern声明中指定一个相对于项目根目录的路径吗?

1 个回答

0

我目前的临时解决办法是,在每个 Python 文件夹里创建一个指向 clibs 目录的符号链接。

为了避免在版本控制中出现问题,我在我的 setup.py 文件的开头和结尾添加了以下内容:

# at the top:
import os
pwd = os.getcwd()

folders = [
    "module",
    "module/folder"
]

for f in folders:
    os.system("ln -s " + pwd + "/clibs " + f + "/clibs")

try:
    # setup commands...
finally:
    # used here so that if setup raises a compilation exception, we 
    # still tidy up:

    for f in folders:
        os.system("rm " + f + "/clibs")

注意:你需要使用完整的 pwd(当前工作目录),如果只指定本地文件夹的名字,符号链接里只会存储这个名字,这样会导致出现 ELOOP(符号链接过多)错误。

我还是想要一个更好的解决方案,这只是个临时的办法,只有在 ln -srm 命令可用时才能用!如果没有其他人提供解决方案,我最终会把这个标记为“接受”,但其实根本不应该需要这样做。

更新:另一个问题是,当代码放在网络文件系统上(比如在 VirtualBox 的共享文件夹里),你不能在虚拟机里创建符号链接,这真的很让人沮丧!

撰写回答