Gerando bindings de bibliotecas C++ para Python

2,356 views
2,345 views

Published on

Shiboken é o gerador de bindings C++ para Python, e é usado pelo PySide os bindings Python da biblioteca Qt.

0 Comments
0 Likes
Statistics
Notes
  • Be the first to comment

  • Be the first to like this

No Downloads
Views
Total views
2,356
On SlideShare
0
From Embeds
0
Number of Embeds
1,381
Actions
Shares
0
Downloads
13
Comments
0
Likes
0
Embeds 0
No embeds

No notes for slide

Gerando bindings de bibliotecas C++ para Python

  1. 1. Gerando bindings de bibliotecasC++ para PythonMarcelo Lira - setanta1 de Outubro / São Paulo - SP
  2. 2. Sobre o palestrante e seus overlords ˆ Desenvolvedor híbrido Python/C++ ˆ Membro da equipe principal do PySide ˆ INDT - Instituto Nokia de Tecnologia
  3. 3. O Que Veremos Hoje ˆ Breve história ˆ Denição do problema ˆ Gerando bindings Mais uma iniciação que um tutorial.
  4. 4. PySide Senta que lá vem estória... ˆ Parte I ˆ Qt da Trolltech. ˆ Nokia compra Trolltech. ˆ Qt da Nokia. ˆ Qt passa do desenvolvimento fechado pro aberto. ˆ Parte II ˆ PyQt da Riverbank. ˆ Nokia negocia com Riverbank. ˆ PyQt da Riverbank. ˆ INDT faz o PySide.
  5. 5. Genealogia do Gerador de Bindings
  6. 6. O Problema Como usar bibliotecas C++ em Python?
  7. 7. Problemas com C ˆ Converter de/para tipos primitivos Python int - int struct MyString - unicode ˆ Representar tipos em Python struct Text { struct MyString* paragraph; int lines; }; Text - Text
  8. 8. Wrappers
  9. 9. Identidade dos Objetos ˆ Objeto passado por valor: alterações sobre a cópia struct Foo; void function(Foo foo); ˆ Objeto passado por ponteiro: alterações sobre o original void function(Foo* foo);
  10. 10. Identidade dos Objetos
  11. 11. Mais Problemas com C++ ˆ Overload de métodos ˆ Métodos virtuais ˆ Coisas protegidas ˆ Conversões implícitas ˆ Herança múltipla ˆ Templates containers ˆ Posse de objetosBinding C++: http://setantas.net/pages/bindingcpp.html
  12. 12. Overload de Métodos
  13. 13. Gerador de Bindings ˆ Coletor de informações sobre a biblioteca C++ alvo ˆ Capaz de inserir modicações do usuário ˆ Necessário para bibliotecas grandes
  14. 14. Shiboken ˆ Shiboken é o gerador de bindings usado para criar os bindings PySide. ˆ Usa Qt, mas os bindings gerados não dependem dela. ˆ Está licenciado sob GPL.
  15. 15. libshiboken ˆ libshiboken é a biblioteca de apoio para os bindings gerados pelo Shiboken. ˆ Licenciada sob a LGPL.
  16. 16. Descrição do Bindingtypesystem package=sample primitive-type name=int/ primitive-type name=Complex target-lang-api-name=PyComplex conversion-rule file=complex_conversions.h/ include file-name=complex.h location=global/ /primitive-type value-type name=Number enum-type name=NumberEnum/ !-- blah blah blah -- /value-type object-type name=SimpleFile/ namespace-type name=SampleNamespace value-type name=SomeClass/ /namespace-type/typesystem
  17. 17. Conversor de Tipos template struct ConverterComplex { static inline bool checkType(PyObject* pyObj) { return PyComplex_Check(pyObj); } static inline bool isConvertible(PyObject* pyObj) { return PyComplex_Check(pyObj); } static inline PyObject* toPython(const Complex cpx) { return PyComplex_FromDoubles(cpx.real(), cpx.imag()); } static inline Complex toCpp(PyObject* pyobj) { double real = PyComplex_RealAsDouble(pyobj); double imag = PyComplex_ImagAsDouble(pyobj); return Complex(real, imag); } };
  18. 18. Namespaces namespace-type name=SampleNamespace value-type name=SomeClass/ /namespace-type ˆ Namespaces C++ se tornam classes não instanciáveis em Python ˆ Classes internas ao namespace aparecem como: import sample obj = sample.SampleNamespace.SomeClass()
  19. 19. Modicações value-type name=Number modify-function signature=sumArray(int*,int) modify-argument index=1 replace-type modified-type=PySequence / /modify-argument modify-argument index=2 remove-argument / /modify-argument inject-code class=target position=beginning int length = PySequence_Size(%PYARG_1); Shiboken::AutoArrayPointerint array(length); for (int i = 0; i length; ++i) array[i] = %CONVERTTOCPP[int](PySequence_GetItem(%PYARG_1, i)); %RETURN_TYPE %0 = %CPPSELF.%FUNCTION_NAME(array, length); %PYARG_0 = %CONVERTTOPYTHON[%RETURN_TYPE](%0); /inject-code /modify-function /value-type
  20. 20. Melhorias Desejáveis ˆ Uma ferramenta para iniciar o desenvolvimento de bindings. ˆ Utilitário gráco para edição atualização dos bindings. ˆ Bindings Python para a libapiextractor (casa de ferreiro...).
  21. 21. Direções Perguntas Código http://github.com/PySide www.pyside.org Lista de discussão http://lists.openbossa.org/listinfo/pyside Canal #pyside no Freenode

×