gpt4 book ai didi

python - 在一个共享对象中 boost python 多个模块

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:40:26 24 4
gpt4 key购买 nike

我正在尝试通过 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 的内存)

在 python 中,如果我调用:

from myPackage.myModule import *

from myPackage.myModule import someClass

内存消耗立即飙升至 65MB。

在进行任何导入之后,如果我调用:系统模块我将包中的所有类都视为“已知”但是,如果我运行:

from myPackage.myModule import class1
c = class2()

我得到一个错误:

NameError: name 'class2' is not defined

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

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

最佳答案

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

上面的代码对于以下形式的调用也是正确的:

from myPackage.myModule import class1
c = class2()

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

一旦共享对象被放置在正确的站点包文件夹中,其中当然有 __init__.py 上面的例子工作正常。

关于python - 在一个共享对象中 boost python 多个模块,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29006439/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com