Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.

Gerando bindings de bibliotecas C++ para Python

2,580 views

Published on

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

  • Be the first to comment

  • Be the first to like this

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

×