在一个共享对象中增加python多个模块

时间:2015-03-12 09:49:48

标签: python c++ boost python-2.6 boost-python

我试图通过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 *

OR

from myPackage.myModule import someClass

内存消耗量急剧上升至65MB。

执行任何导入后,如果我打电话: sys.modules中 我看到我的包中的所有类都是&#34;已知&#34; 但是如果我跑:

from myPackage.myModule import class1
c = class2()

我收到错误:

  

NameError:name&#39; class2&#39;未定义

所以看起来我得到了两个世界中最糟糕的一个,一方面我消耗了内存,好像我从包中导入了所有东西,另一方面我没有得到实际导入的类。

任何想法如何解决这个问题,这样当我导入一个特定模块时,它只会被导入,而不是所有的包数据都会被读取到python内存中。 (这既花费时间又消耗了大量宝贵的记忆)

1 个答案:

答案 0 :(得分:3)

所以这比我想象的要简单得多。

上述代码也适用于以下列形式进行调用:

from myPackage.myModule import class1
c = class2()

阻止系统正确执行的是系统路径。 共享对象未放置在python路径的位置和 在放置它的文件夹中没有__init__.py

只要共享对象放在正确的site-packages文件夹中, 当然有__init__.py上述示例正常工作。