2017-09-23 4 views
0

MWEに近づくには、私の問題を示すprojectの例があります。 プロジェクトは、ラップされたC++クラス(この場合はPCLHeaderオブジェクト)で簡単な操作を実行しようとします。cython cmakeモジュールランタイムエラー

私のcmakeコールには2つの.pyxファイルが含まれているという問題があります。 cython_add_module(test_cython common.pyx test_cython.pyx)

プロジェクトの一部であるUseCython.cmakeのドキュメントに基づいて、私の言う限り、この呼び出しは大丈夫です。

私はこのプロジェクトをビルドし、結果のライブラリをインポートしようとすると、Pythonは最初にをインポートするのに失敗します。さておき、これはいくつかの方法で間違っているならば誰もがより良い設計に向かって私を操縦することができれば、私はそれを感謝として

In [1]: import test_cython 
--------------------------------------------------------------------------- 
ImportError        Traceback (most recent call last) 
<ipython-input-1-158d7481838a> in <module>() 
----> 1 import test_cython 

common.pxd in init test_cython (/Users/phil/devel/test_cython/build/test_cython.cxx:1424)() 

ImportError: No module named common 

In [2]: import test_cython 

In [3]: 

。たとえば、this lineが私のセットアップに基づいてコンパイルエラーを引き起こす理由を理解できません。

答えて

2
cython_add_module(test_cython common.pyx test_cython.pyx) 

これは、単一のモジュール(test_cython.soまたは類似のもの)にcommontest_cythonをコンパイル。インポートすると、test_cythonの初期化が実行されますが、commonの初期化は実行されません。一部では

(Pythonがコンパイルされたモジュールをロードすると、関数を使用すると、Pythonの2または3を実行している場合PyInit_commonが存在するが、あなたがtest_cythonを輸入しているので、それが呼び出されない上に応じてPyInit_<modulename>またはinit_<modulename>と呼ばれる実行されます) test_cythonの範囲内にある場合は、commonからインポートを試みます。 Pythonのインポートメカニズムは、各モジュールを別々のファイルに基づいています。まず、異なるファイルタイプのリスト(common.pycommon.pyccommon.soなど)を検索し、それらのどれも見つかりません。したがって、ImportErrorが発生します。

Cython doesn't support compiling multiple modules into a single .so file。 (ただし、Cインターフェイスのみを使用する場合は、類似しているものもありますが、動作しているとは思えません)。おそらく正しく種類を推定するために、あなたはおそらくそれらを指定することによって、これを修正することができます失敗しています - あなたのコンパイル時のエラーに関して

cython_add_module(test_cython test_cython.pyx) 
cython_add_module(common common.pyx) 
+0

:何をする必要がある第二のモジュールにtest_cython.pyx 1のモジュールとcommon.pyxをコンパイルしています。しかし、私は実際にエラーが何であるか分からない。 – DavidW

+0

私はデバッグ中にあなたのソリューションを試しましたが、私は 'target_link_libraries'を呼び出して失敗したと思います。それはリンクせずに動作するということは私には起こりませんでしたが、インポートのコンテキストでは意味があります。ありがとう、私はすぐに – phil0stine

+0

Worked、期待どおりにテストされます。私はupvoteに私のために編集する必要があると思う(私は私の子供が誤ってdownvotedと思う)が、私はどちらの場合でも受け入れます。コンパイルエラーに関しては、次の 'cdef PCLHeader hw = HeaderWrap(h).header_cpp [0]'の場合でも、古典的な 'Pythonオブジェクトを 'PCLHeader'に変換できません。いずれにしても、ありがとうございます。 – phil0stine