簡體   English   中英

在一個共享對象中增加python多個模塊

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM