Я получил возможность выставлять некоторые классы C++ для python с помощью boost. Я определил два разных модуля, связанных статически с моим приложением. Я могу использовать классы, определенные в этих модулях, полученных им, и т.д.Трассировка открытых классов при наличии нескольких модулей Boost.Python
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
Это доказывает, что __ модуль __ для этого класса атрибут не заполняется должным образом. Я не могу найти рабочий стол. Я не нашел людей, имеющих аналогичную проблему.
Спасибо за любую помощь или предложение.
Я не думаю, что ваши проблемы связаны с тем, что это класс C. Это похоже на ошибку, связанную с наличием нескольких модулей. Правильно ли я полагаю, что это ситуация вложения? Поскольку оба модуля статически связаны? Является ли BP самонастроенным? –
Да, вы правы. Это ситуация вложения, я должен был это упомянуть. boost :: python сам по себе не статически связан. После поиска немного больше об этой проблеме я нашел дискуссию о той же самой проблеме: http://www.gossamer-threads.com/lists/python/dev/255760 Кажется, что проблема исходит от boost: python , что он старый (10 лет) и вряд ли будет разрешен. Я нашел рабочий стол: я вручную установил поле __ module __ в инициализации модуля. –
Я рад, что вы нашли решение. Если вы добавите его в качестве ответа на этот вопрос, тогда другие люди смогут его продвинуть. –