2012-02-29 2 views
1

Я получил возможность выставлять некоторые классы 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 

Это доказывает, что __ модуль __ для этого класса атрибут не заполняется должным образом. Я не могу найти рабочий стол. Я не нашел людей, имеющих аналогичную проблему.

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

+0

Я не думаю, что ваши проблемы связаны с тем, что это класс C. Это похоже на ошибку, связанную с наличием нескольких модулей. Правильно ли я полагаю, что это ситуация вложения? Поскольку оба модуля статически связаны? Является ли BP самонастроенным? –

+1

Да, вы правы. Это ситуация вложения, я должен был это упомянуть. boost :: python сам по себе не статически связан. После поиска немного больше об этой проблеме я нашел дискуссию о той же самой проблеме: http://www.gossamer-threads.com/lists/python/dev/255760 Кажется, что проблема исходит от boost: python , что он старый (10 лет) и вряд ли будет разрешен. Я нашел рабочий стол: я вручную установил поле __ module __ в инициализации модуля. –

+0

Я рад, что вы нашли решение. Если вы добавите его в качестве ответа на этот вопрос, тогда другие люди смогут его продвинуть. –

ответ

1

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

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

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

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

Смежные вопросы