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

时间:2013-03-16 16:33:04

标签: c++ python cython

我有一个项目,包含不同文件夹中的几个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.pyxcimport来自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 :(得分: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 -srm存在时才有效!如果没有其他内容发布,我最终会将其标记为“已接受”,但这根本不是必需的。

更新:另一个错误是,当代码在网络文件系统上时(例如在VirtualBox中的共享文件夹中),您不允许在访客上创建符号链接 - 非常令人沮丧!