Cython/C++ - PXD文件中的头文件路径
我有一个项目,里面有几个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
中,我使用cimport
从module/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 -s
和 rm
命令可用时才能用!如果没有其他人提供解决方案,我最终会把这个标记为“接受”,但其实根本不应该需要这样做。
更新:另一个问题是,当代码放在网络文件系统上(比如在 VirtualBox 的共享文件夹里),你不能在虚拟机里创建符号链接,这真的很让人沮丧!