Выборка открытых классов при наличии нескольких модулей Boost.Python - PullRequest
2 голосов
/ 29 февраля 2012

Мне удалось представить некоторые классы C ++ для python с помощью boost. Я определил два отдельных модуля, статически связанных с моим приложением. Я могу использовать классы, определенные в этом модуле, их производные и т. Д.

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

Однако я не могу их засолить из-за ошибки, не связанной с засолкой. Атрибут __ module __ неверен для моих классов. Таким образом, рассол не может вернуть класс. Если мои два модуля 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 __ не заполнен должным образом для этого класса. Я не могу найти обходной путь. Я не нашел людей с подобной проблемой.

Спасибо за любую помощь или предложение.

1 Ответ

2 голосов
/ 16 марта 2012

Согласно другим обсуждениям , в настоящее время нет идеального решения этой проблемы. Однако существует способ «вручную» решить проблему, задав поле __ module __ в инициализации модуля.

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

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

Таким образом, pickle не сможет определить модуль, в котором определен класс.

...