22

相互に依存するいくつかの python モジュール (パッケージに編成) があります。例えば

  • モジュール1
  • Module2: Module1 をインポートします
  • モジュール3
  • Module4: Module3、Module 2、Module 1 をインポートします。

アプリケーションを開発するための関連するインターフェイスが Module4 にあり、 cython を使用してModule4.soを生成したいとします。素朴な方法で進めると、拡張 Module4.so を取得できます。これをインポートできますが、拡張は Module1、Module2、Module3 の Python ソース コードに依存しています。

Module1、Module2、Module3 もコンパイルされて Module4 にリンクされるようにコンパイルする方法はありますか? すべてを手動で行うことは避けたいと思います。たとえば、最初に Module1.so をコンパイルし、次に Module2 のインポート宣言を変更して、Module1.py ではなく Module1.so をインポートし、次に Module2 を Module2.so にコンパイルします。

4

1 に答える 1

15

編集。最初の 2 つのオプションは、Cython の特定のコードを参照しています。私が見逃したのは、質問が純粋な python モジュールに関するものであるため、オプション 3 が解決策です。

いくつかのオプションがあります:

1. この「パッケージ内のモジュールの階層を作成する方法」を参照してください: https://github.com/cython/cython/wiki/PackageHierarchy

2. 私は「include」ステートメントを好みます: http://docs.cython.org/src/userguide/language_basics.html#the-include-statement 多くの .pyx ファイルがあり、それらはすべて main.pyx に含まれています。すべて 1 つの名前空間に。結果は 1 つの大きなモジュールです: http://code.google.com/p/cefpython/source/browse/cefpython.pyx

3.複数の「拡張機能」を追加することにより、セットアップを使用してすべてのモジュールを一度にコンパイルできます。

setup(
    cmdclass = {'build_ext': build_ext},
    ext_modules = [Extension("example", sourcefiles), Extension("example2", sourcefiles2), Extension("example3", sourcefiles3)]
)

4. より効率的なコンパイル -こちらを参照してください。

setup (
    name = 'MyProject',
    ext_modules = cythonize(["*.pyx"]),
)
于 2012-07-16T15:50:07.460 に答える