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.pyxIcimportで からの宣言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フォルダーにディレクトリへのシンボリックリンクを作成することです。

これがバージョン管理の問題になるのを防ぐために、以下を my の上部と下部に追加しました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 too many symlinks エラーが発生します。

私はまだこれに対するより良い解決策を望んでいます。これは単なる汚いハックであり、そこにある場合にのみ有効ln -sですrm! 他に何も投稿されていない場合は、最終的にこれを「承認済み」とマークしますが、これはまったく必要ありません.

更新: もう 1 つのバグは、コードがネットワーク化されたファイルシステム (VirtualBox の共有フォルダーなど) にある場合、ゲストでシンボリックリンクを作成できないことです。非常にイライラします!

于 2013-03-16T22:35:33.463 に答える