python - 当有多个 Boost.Python 模块时,Pickling 公开的类

标签 python boost-python pickle

在 boost 的帮助下,我实现了向 python 公开一些 C++ 类。我定义了两个静态链接到我的应用程序的不同模块。我可以使用这些模块中定义的类、派生它们等。

BOOST_PYTHON_MODULE(module1)
{
  class_<MyClass, boost::noncopyable>("MyClass", no_init)
    .enable_pickling();
}

但是,由于与 pickle 无关的错误,我无法对它们进行 pickle。 __ module __ 属性对于我的类来说不正确。因此,pickle没能把类(class)带回来。如果我的两个python模块是“module1”和“module2”,并且module1定义了一个类名MyClass,则代码如下:

print(module1.MyClass.__name__)
print(module1.MyClass.__module__)

pickle.dumps(module1.MyClass,0)

将输出

MyClass
module2
Traceback (most recent call last):
  File "main.py", line 23, in <module>
    pickle.dumps(module1.MyClass,0)
_pickle.PicklingError: Can't pickle <class 'module2.MyClass'>: attribute lookup
module2.MyClass failed

这证明该类的 __ module __ 属性没有正确填充。我找不到解决方法。我没有发现任何人有类似的问题。

感谢您的帮助或建议。

最佳答案

根据other discussions ,目前这个问题还没有理想的解决方案。不过,有一种方法可以“手动”解决问题,即在模块初始化中设置 __ module __ 字段。

BOOST_PYTHON_MODULE(module1)
{
  class_<MyClass, boost::noncopyable> myClass("MyClass", no_init)
    .enable_pickling();

  myClass.attr("__module__") = "module1";
}

这样,pickle 就不会无法识别定义该类的模块。

关于python - 当有多个 Boost.Python 模块时,Pickling 公开的类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9504255/

相关文章:

python - python joblib和随机游走-[CONCURRENT]-进程调度的性能

c++ - boost.python 不支持并行性?

python - 加载pickle文件: 'DataFrame' object has no attribute '_data' 后引发异常

mysql - Web2py,多个Ajax调用和存储在MySQL中的 session 变量

python - 多进程初始化程序和 pickle

python - 从 for 循环创建列表

python - 合并两个没有重复值的列表

Python Flask Web API [Heroku] : It runs locally but shows Application Error when deployed

python - 无法与 boost.python 和 python3 链接

python - 如何从 python 模块 (boost.python) 导入类?