2011-11-14 54 views
2

我正在使用SWIG爲Python編寫一個C++擴展。從我所瞭解的Python和SWIG中,每個模塊都必須有自己的.pyd文件。例如,如果我有一個名爲'mymodule'的模塊,應該有一個相應的'_mymodule.pyd'文件。Python和SWIG - 單個.pyd中的多個模塊(.so)

在我的特殊情況下,我想只有一個'pyd'文件和多個模塊鏈接到它。

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

我不希望有保持倍數.pyd,這樣我就可以把我的界面(.I)文件下的所有在VS2010同一個項目。

編輯:到目前爲止,我能夠使其工作的唯一方法是將我的'pyd'文件複製到兩個新文件中:_module1.pyd和_module2.pyd。但我不喜歡這個解決方案,因爲我需要不必要地複製30 Mo的'pyd'文件。我希望模塊鏈接到一個'_package.pyd'文件。

這樣做的最好方法是什麼?

+3

這不是很清楚,你不能在.pyd中有不同的'模塊',因爲python加載器會加載del dll/so並調用init 函數,也許你可以在內部使用一個命名空間並註冊不同的東西,比如mymodule.stuff1 mymodule .stuff2,這應該有不同模塊的相似命名空間。 我不確定你可以作弊並調用多個Py_InitModule – sherpya

回答

0

最後,最簡單的方法和「正確的」方法是創建多個項目,只調用大型整體項目的一些暴露部分。較小的項目將由SWIG解析以創建Python模塊。奇蹟般有效。

+0

這也是我所做的,但我厭倦了爲每個模塊維護構建指令。 –

+1

我同意,但另一方面,我覺得這種方法非常靈活。 – MasterMind

+0

@MasterMind你的意思是你是從兩個界面文件創建兩個單獨的SWIG dll,並且每個都調用第三個「大」dll?如果是這樣,這是否意味着你必須改變大dll中的一些函數簽名來「導出」,以便較小的可以鏈接到它? – topspin