我有一个项目,包含不同文件夹中的几个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
子句中指定相对于项目根目录的路径吗?
答案 0 :(得分: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太多的符号链接错误。< / p>
我仍然想要一个更好的解决方案,这只是一个肮脏的黑客,只有在ln -s
和rm
存在时才有效!如果没有其他内容发布,我最终会将其标记为“已接受”,但这根本不是必需的。
更新:另一个错误是,当代码在网络文件系统上时(例如在VirtualBox中的共享文件夹中),您不允许在访客上创建符号链接 - 非常令人沮丧!