2011-11-14 7 views
2

私はSWIGを使ってPythonのC++拡張を書いています。私がPythonとSWIGについて理解しているところから、各モジュールには独自の.pydファイルが必要です。たとえば、 'mymodule'という名前のモジュールがある場合、対応する '_mymodule.pyd'ファイルが存在するはずです。PythonとSWIG - 単一の.pyd(.so)の複数のモジュール

私の特別なケースでは、1つの 'pyd'ファイルと複数のモジュールがリンクされています。

mypackage/ 
mypackage/__init__.py 
mypackage/module1.py 
mypackage/module2.py 

(.I)VS2010で同じプロジェクトの下にあるすべてのファイルを、私は倍数の.pydを維持する必要がありますする必要はありませんので、私は私のインターフェイスを置くことができます。

編集:これまでのところ、私がそれを動作させる唯一の方法は、 'pyd'ファイルを_module1.pydと_module2.pydの2つの新しいファイルに複製することです。しかし私は不必要に30Moの 'pyd'ファイルを複製する必要があるので、この解決策が嫌いです。モジュールを1つの '_package.pyd'ファイルにリンクする方が好きです。

これを実行する最善の方法は何ですか?

+3

Pythonローダーがdel dll/soをロードしてinit 関数を呼び出すため、.pydに異なる 'modules'を持つことはできません。内部的に名前空間を使用し、mymodule.stuff1のような別のものを登録できますmymodule .stuff2、これは異なるモジュールの名前空間が似ているはずです。 私はあなたが不正行為をして複数のPy_InitModuleを呼び出すことができないと確信しています – sherpya

答えて

0

最後に、最も簡単なやり方は、大きなモノリシックプロジェクトの露出した部分だけを呼び出す複数のプロジェクトを作成することです。小規模なプロジェクトは、SWIGによってPythonモジュールを作成するために解析されます。魅力のように動作します。

+0

これは私がやっていることですが、私は各モジュールのビルド手順を維持するのがうんざりです。 –

+1

私は同意しますが、一方で私はこのアプローチが非常に柔軟であると感じています。 – MasterMind

+0

@ MasterMindあなたは2つのインターフェースファイルから2つの別々のSWIG dllを作成しており、それぞれが第3の "大きな" dllを呼び出すのですか?もしそうなら、大規模なDLLのいくつかの関数シグネチャを 'エクスポート'するように変更しなければならないので、小さなものはそれにリンクできますか? – topspin

関連する問題