2012-07-16 8 views
12

私はがお互いに依存(パッケージに編成)いくつかのpythonモジュールを、持っています。例えば複数のpythonモジュール(またはパッケージ)をcythonでコンパイルしてリンクする方法は?

  • Module1の
  • モジュール2:Module1を
  • モジュール3
  • Module4をインポート:モジュール3、モジュール2を輸入し、モジュール1

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

Module1、Module2、Module3もをコンパイルし、Module4にをリンクするようにコンパイルする方法はありますか?私はすべて手作業を避けたいと思います。最初.... Module1.soがModule1.soではなくModule1.pyをインポートするように、その後、その後、モジュール2に輸入申告を変更するようにModule2.soにモジュール2をコンパイルし、

感謝をコンパイル!

答えて

9

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

1. これは、「どのようにパッケージ内のモジュールの階層を作成する」を参照してください:

2. https://github.com/cython/cython/wiki/PackageHierarchy

は、私が「含める」ステートメントを好む:

は、いくつかのオプションがありますhttp://docs.cython.org/src/userguide/language_basics.html#the-include-statement 私は多くの.pyxファイルを持っており、それらは全てmain.pyxに含まれているが、それはすべて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. よりefficentコンパイル - 参照しますhere

setup (
    name = 'MyProject', 
    ext_modules = cythonize(["*.pyx"]), 
) 
+0

ありがとうございますので、オプション3ではModule3.soではなく、Module3.soが自動的にインポートされます(上記の例を参照してください)。 – Mannaggia

+0

@Mannaggiaは、ああ、今私はあなただけcythonを使用して、通常のPythonモジュールをコンパイルしたい、あなたはCython特定の機能(「PYX」ファイル)を使用していないことがわかります。はい、文の「インポートModule1が」「Module1.py」または「Module1.so」をインポートするための作品 - ちょうど私は、インポートされるモジュールを知らないと同じディレクトリに両方のファイルを置かないでください。変更はありません。.soはインポート時に.pyファイルのように扱われます。 –

+1

@Mannaggia、何も変わらず、.soはインポート時に.pyファイルのように扱われます。 .pyモジュールを.soにコンパイルした後は、すべてがそのまま動作するはずです。 –

関連する問題