2013-03-16 82 views
1

我已經在不同的文件夾包括幾個用Cython模塊項目:用Cython/C++ - 在共享PXD文件頭文件路徑

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 I cimport來自module/folder/file1.pxd的聲明:

from module.folder.file1 cimport MyCppClass, MyPyClass 

現在,當我嘗試建立這個,用Cython閱讀module/folder/file1.pxd時產生的線

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

,並且將其放入到新生成的module/file2.cpp,這顯然是一個無效的路徑!

我該如何解決這個問題?我可以在我的extern子句中指定相對於項目根目錄的路徑嗎?

回答

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中的共享文件夾中),您不允許在來賓上創建符號鏈接 - 非常令人沮喪!