[英]Boost python multiple modules in one shared object
我正在嘗試通過boost python創建一個包含幾個模塊的包。
原因是我們希望公開一個非常大的API,將它組合在不同的模塊中以便於使用和保留python內存使用是有意義的。 另一方面,我們被迫(由於超出此問題范圍的原因將其編譯為單個共享對象 )
所以我用boost python創建了一個導出幾個模塊的包,如下所示:
void exportClass1()
{
namespace bp = boost::python;
// map the IO namespace to a sub-module
// make "from myPackage.class1 import <whatever>" work
bp::object class1Module(bp::handle<>(bp::borrowed(PyImport_AddModule("myPackage.class1"))));
// make "from mypackage import class1" work
bp::scope().attr("class1") = class1Module;
// set the current scope to the new sub-module
bp::scope io_scope = class1Module;
// export stuff in the class1 namespace
class_<class1 >("class1", init<>())
.
. CLASS SPECIFICS GO HERE
.
Other class of module class1 go here as well
}
BOOST_PYTHON_MODULE(myPackage)
{
namespace bp = boost::python;
// specify that this module is actually a package
bp::object package = bp::scope();
package.attr("__path__") = "myPackage";
exportClass1();
exportClass2();
.
.
.
}
這段代碼有效。
主要問題是內存消耗。 整個暴露的api 非常大,所以加載整個包裝消耗大約65MB的ram,僅用於所有聲明。 (在包用戶開始做任何事情之前)
這當然是不可接受的。 (假設加載單個模塊應該消耗1-3MB的RAM)
在python中,如果我打電話:
from myPackage.myModule import *
要么
from myPackage.myModule import someClass
內存消耗量急劇上升至65MB。
在執行任何導入后,如果我調用:sys.modules我看到我的包中的所有類都是“已知”但是如果我運行:
from myPackage.myModule import class1
c = class2()
我收到一個錯誤:
NameError:未定義名稱“class2”
所以我似乎得到了兩個世界中最糟糕的一方面,一方面我消耗內存,好像我從包中導入了所有東西,另一方面我沒有得到實際導入的類。
任何想法如何解決這個問題,這樣當我導入一個特定的模塊時,它只會被導入,而不是所有的包數據都會被讀取到python內存中。 (這既花費時間又消耗了大量寶貴的記憶)
所以這比我想象的要簡單得多。
以上代碼也適用於以下列形式進行調用:
from myPackage.myModule import class1
c = class2()
阻止它正確執行的是系統路徑。 共享對象未放置在python路徑的位置,並且在放置它的文件夾中沒有__init__.py
。
只要共享對象放在正確的site-packages文件夾中,當然有__init__.py
,上面的示例就可以正常工作。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.