1

我有一个项目,由不同文件夹中的几个 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子句中指定相对于项目根目录的路径吗?

4

1 回答 1

0

clibs我的(临时)解决方案是在每个 python 文件夹中创建一个指向目录的符号链接。

为了阻止这成为版本控制的问题,我在我的顶部和底部添加了以下内容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 中的共享文件夹中),您不允许在来宾上创建符号链接 - 非常令人沮丧!

于 2013-03-16T22:35:33.463 回答