11

異なるパッケージでcdef-ed型をコンパイルする際に問題が発生し、cythonのドキュメントで説明が見つかりませんでした。

Pythonsrcツリーのルートに次のsetup.pyがあります。

from distutils.core import setup
from distutils.extension import Extension
from Cython.Distutils import build_ext

setup(
   cmdclass = {'build_ext': build_ext},
   ext_modules = [ 
      Extension("flink.pytk.defs.FragIdx", 
         sources = ["flink/pytk/defs/FragIdx.pyx"]),
      Extension("flink.pytk.fragments.STK_idx", 
         sources = ["flink/pytk/fragments/STK_idx.pyx"])
      ]   
)

FragIdxは、flink / pytk / defs/FragIdx.pyxで定義されているcdef-edタイプです。

cdef class FragIdx:
   cdef public FragIdx parent
   cdef public FragIdx root
   cdef public tuple label
   ...

また、STK_idxはFragIdxの拡張であり、flink / pytk / Fragments/STK_idx.pyxで定義されています。

from flink.pytk.defs.FragIdx import FragIdx
cdef class STK_idx(FragIdx):
   ...

投稿の冒頭に記載されているsetup.pyを使用してコンパイルしようとすると、FragIdxは正常にコンパイルされますが、STK_idxに関しては、次のエラーメッセージが表示されます。

flink/pytk/fragments/STK_idx.pyx:5:5: 'FragIdx' is not a type name

ソースツリーのルートディレクトリが$PYTHONPATHにリストされていることに注意してください。

誰かがこれに光を当てることができれば本当にありがたいです、どうもありがとう!

ダニエレ

4

1 に答える 1

12

ああ、まあ、同じような問題を抱えている人にとっては、おそらく私は答えを見つけたようです。

pythonが共有ライブラリFragIdx.soにコンパイルされたシンボルを自動的にスキャンすることを期待していましたが、代わりに、この情報を.pxdファイル(Cythonの実行後にCヘッダーファイルになる)として明示的に提供する必要があるようです。

このプロセスには、基本的に2つのステップが含まれます。

  1. スーパークラスの定義(.pxd)ファイルの作成。
  2. サブクラスモジュールのcimport(ではなく)を介したスーパークラス定義のインポート。import

それで、それをより一般的にするために。

Aモジュールでcdef-edタイプを定義したとしますpkg1.mod1。次に、そのサブクラスの型をcdefBpkg2.mod2ますA

ディレクトリ構造は次のようになります。

pkg1/
  mod1.pyx
  mod1.pxd
pkg2/
  mod2.pyx
  mod2.pxd

あなたが持っているだろう、pkg1/mod1.pxd言う:

cdef class A:
  cdef int a
  cdef int b

そして、pkg1/mod1.pyxあなたはあなたのクラスのメソッドを提供するでしょう。ではpkg2/mod2.pxd、次のようになります。

from pkg1.mod1 cimport A  #note "cimport"!!
cdef class B(A):
  cdef ... # your attributes here

そして再び、pkg2/mod2.pyxあなたはcimport再びAシンボルをしなければならないでしょう:

from pkg1.mod1 cimport A #note "cimport"!!
cdef class B(A):
  ... # your methods here

A興味深いことに、サブタイプを定義するために使用するのではなく、Pythonコードで使用するだけの場合は、定義ファイルmod1.pxdは必要ありません。これは、拡張タイプを作成するときにCコンパイラで使用できる定義が必要であるのに対し、Pythonコードを実行する場合はこの問題が発生しないという事実に関連していますが、あまり直感的ではないため、ポイントすることが重要かもしれません。アウト。

この情報は実際にはCythonのドキュメントで入手できますが、もう少し明確になる可能性があります。

この情報が誰かにいくらかを救うことができることを願っています。

于 2011-03-05T19:40:25.613 に答える