我试图通过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内存中。 (这既花费时间又消耗了大量宝贵的记忆)
答案 0 :(得分:3)
所以这比我想象的要简单得多。
上述代码也适用于以下列形式进行调用:
from myPackage.myModule import class1
c = class2()
阻止系统正确执行的是系统路径。
共享对象未放置在python路径的位置和
在放置它的文件夹中没有__init__.py
。
只要共享对象放在正确的site-packages文件夹中,
当然有__init__.py
上述示例正常工作。