• Share
  • Email
  • Embed
  • Like
  • Save
  • Private Content
Gerando bindings de bibliotecas C++ para Python
 

Gerando bindings de bibliotecas C++ para Python

on

  • 2,140 views

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

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

Statistics

Views

Total Views
2,140
Views on SlideShare
945
Embed Views
1,195

Actions

Likes
0
Downloads
11
Comments
0

2 Embeds 1,195

http://pugpe.wordpress.com 1192
https://pugpe.wordpress.com 3

Accessibility

Categories

Upload Details

Uploaded via as Adobe PDF

Usage Rights

CC Attribution-ShareAlike LicenseCC Attribution-ShareAlike License

Report content

Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
  • Full Name Full Name Comment goes here.
    Are you sure you want to
    Your message goes here
    Processing…
Post Comment
Edit your comment

    Gerando bindings de bibliotecas C++ para Python Gerando bindings de bibliotecas C++ para Python Presentation Transcript

    • Gerando bindings de bibliotecasC++ para PythonMarcelo Lira - setanta1 de Outubro / São Paulo - SP
    • Sobre o palestrante e seus overlords ˆ Desenvolvedor híbrido Python/C++ ˆ Membro da equipe principal do PySide ˆ INDT - Instituto Nokia de Tecnologia
    • O Que Veremos Hoje ˆ Breve história ˆ Denição do problema ˆ Gerando bindings Mais uma iniciação que um tutorial.
    • 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.
    • Genealogia do Gerador de Bindings
    • O Problema Como usar bibliotecas C++ em Python?
    • 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
    • Wrappers
    • 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);
    • Identidade dos Objetos
    • 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
    • Overload de Métodos
    • 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
    • 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.
    • libshiboken ˆ libshiboken é a biblioteca de apoio para os bindings gerados pelo Shiboken. ˆ Licenciada sob a LGPL.
    • Descrição do Binding<typesystem 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>
    • Conversor de Tipos template<> struct Converter<Complex> { 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); } };
    • 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()
    • 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::AutoArrayPointer<int> 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>
    • 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...).
    • 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