2

新しい拡張機能を作成せずに、pyxファイル上に複製されたcdefを収集するpxd定義ファイルを作成する最も簡単な方法は何ですか?

私の場合は次のとおりです。pxdファイル(hp / src / common.pxd)にいくつかの外部cdefを収集したいと思います。また、実装がcommon.pyxである非外部cdefもいくつか追加しました。

別のpyxファイル(hp / src / _lib.pyx)で、拡張機能に変換し、commonからいくつかのものをcimportします。

setup.pyファイルで、次の拡張子を作成します。

Extension('hp._lib', 
          ['hp/src/_lib.pyx'],
          language='c++'),

そうすることで、common.cppファイルが作成されないため、依存関係が自動的に処理されないように見えます。それが最初の問題です。

次に、手動で「cython --cplus common.pyx」を実行すると、ディレクトリhp / srcにcommon.cppファイルが正しく作成され、拡張ソースのリストに「hp / src / common.cpp」を追加すると、次のコマンドが実行されます。 python setup.pyは文句なしにすべてをインストールしますが、モジュールhpをインポートするとImportErrorがトリガーされます:commonという名前のモジュールはありません... from_lib.cpp...私はここで立ち往生しています。何か案が?

4

2 に答える 2

3

includeステートメントを使用して、別のファイルの素材を含めることができます。

こちらのドキュメントを参照してください。

http://docs.cython.org/src/userguide/language_basics.html#the-include-statement

に外部定義common.pxdと実装がcommond.pyxある場合は、両方を含める必要があります。たとえば、_lib.pyx

include "common.pxd"
include "common.pyx"

これらのファイルの内容は_lib、その時点でテキストで含まれているかのようにモジュールにコンパイルされます。つまり、common.cファイルは生成されませんが、に含まれ_lib.cます。

.cCythonコンパイラは、モジュールのファイルを再生成する必要があるかどうかを判断するときに、インクルードへの変更を認識しないため、再コンパイルする前にこれを削除することを忘れないでください。

于 2012-12-24T15:40:06.280 に答える
0

.pyxファイルと.pxdファイルを.pyファイルとまったく同じように構造化すると、運がはるかに良くなります。これには、ファイルにcommon.pyxの拡張子を付けることが含まれsetup.pyます。cythonizeを使用して依存関係を処理してみてください。

于 2016-07-07T07:48:38.757 に答える