SlideShare uma empresa Scribd logo
1 de 21
Baixar para ler offline
Gerando bindings de bibliotecas
C++ para Python
Marcelo Lira - setanta
1 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 objetos
Binding 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 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);
    }
 };
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::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
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

Mais conteúdo relacionado

Mais procurados

Postgresql + Python = Power!
Postgresql + Python = Power!Postgresql + Python = Power!
Postgresql + Python = Power!Juliano Atanazio
 
Iteraveis e geradores em Python
Iteraveis e geradores em PythonIteraveis e geradores em Python
Iteraveis e geradores em PythonLuciano Ramalho
 
Escreva aplicações web assíncronas com python3 + tornado
Escreva aplicações web assíncronas com python3 + tornadoEscreva aplicações web assíncronas com python3 + tornado
Escreva aplicações web assíncronas com python3 + tornadoWilson Júnior
 
Desenvolvendo Extensões PECL
Desenvolvendo Extensões PECLDesenvolvendo Extensões PECL
Desenvolvendo Extensões PECLW3P Projetos Web
 
Python para quem sabe Python (aula 2)
Python para quem sabe Python (aula 2)Python para quem sabe Python (aula 2)
Python para quem sabe Python (aula 2)Luciano Ramalho
 
Hooks, o condimento mágico e escondido do WordPress
Hooks, o condimento mágico e escondido do WordPressHooks, o condimento mágico e escondido do WordPress
Hooks, o condimento mágico e escondido do WordPressZé Fontainhas
 
Python: Iteraveis, geradores etc
Python: Iteraveis, geradores etcPython: Iteraveis, geradores etc
Python: Iteraveis, geradores etcLuciano Ramalho
 
Python e django na prática
Python e django na práticaPython e django na prática
Python e django na práticaRafael Cassau
 
Perl Moderno, dia5
Perl Moderno, dia5Perl Moderno, dia5
Perl Moderno, dia5garux
 
Perl Moderno, dia4
Perl Moderno, dia4Perl Moderno, dia4
Perl Moderno, dia4garux
 
Orientação a objetos em Python (compacto)
Orientação a objetos em Python (compacto)Orientação a objetos em Python (compacto)
Orientação a objetos em Python (compacto)Luciano Ramalho
 
Orientação a Objetos em Python
Orientação a Objetos em PythonOrientação a Objetos em Python
Orientação a Objetos em PythonLuciano Ramalho
 
Perl Moderno, dia2
Perl Moderno, dia2Perl Moderno, dia2
Perl Moderno, dia2garux
 
TDC2017 | Florianopolis - Trilha DevOps How we figured out we had a SRE team ...
TDC2017 | Florianopolis - Trilha DevOps How we figured out we had a SRE team ...TDC2017 | Florianopolis - Trilha DevOps How we figured out we had a SRE team ...
TDC2017 | Florianopolis - Trilha DevOps How we figured out we had a SRE team ...tdc-globalcode
 
(Portuguese) Java EE Poliglota
(Portuguese) Java EE Poliglota(Portuguese) Java EE Poliglota
(Portuguese) Java EE PoliglotaPhil Calçado
 

Mais procurados (20)

Postgresql + Python = Power!
Postgresql + Python = Power!Postgresql + Python = Power!
Postgresql + Python = Power!
 
Iteraveis e geradores em Python
Iteraveis e geradores em PythonIteraveis e geradores em Python
Iteraveis e geradores em Python
 
Desenvolvimento de Extensões PECL
Desenvolvimento de Extensões PECLDesenvolvimento de Extensões PECL
Desenvolvimento de Extensões PECL
 
Escreva aplicações web assíncronas com python3 + tornado
Escreva aplicações web assíncronas com python3 + tornadoEscreva aplicações web assíncronas com python3 + tornado
Escreva aplicações web assíncronas com python3 + tornado
 
Desenvolvendo Extensões PECL
Desenvolvendo Extensões PECLDesenvolvendo Extensões PECL
Desenvolvendo Extensões PECL
 
Python para quem sabe Python (aula 2)
Python para quem sabe Python (aula 2)Python para quem sabe Python (aula 2)
Python para quem sabe Python (aula 2)
 
Hooks, o condimento mágico e escondido do WordPress
Hooks, o condimento mágico e escondido do WordPressHooks, o condimento mágico e escondido do WordPress
Hooks, o condimento mágico e escondido do WordPress
 
Python: Iteraveis, geradores etc
Python: Iteraveis, geradores etcPython: Iteraveis, geradores etc
Python: Iteraveis, geradores etc
 
Python e django na prática
Python e django na práticaPython e django na prática
Python e django na prática
 
Iteraveis e geradores
Iteraveis e geradoresIteraveis e geradores
Iteraveis e geradores
 
Al sweigart, cap 3
Al sweigart, cap 3Al sweigart, cap 3
Al sweigart, cap 3
 
Perl Moderno, dia5
Perl Moderno, dia5Perl Moderno, dia5
Perl Moderno, dia5
 
Jquery a technical overview
Jquery a technical overviewJquery a technical overview
Jquery a technical overview
 
Perl Moderno, dia4
Perl Moderno, dia4Perl Moderno, dia4
Perl Moderno, dia4
 
Orientação a objetos em Python (compacto)
Orientação a objetos em Python (compacto)Orientação a objetos em Python (compacto)
Orientação a objetos em Python (compacto)
 
Orientação a Objetos em Python
Orientação a Objetos em PythonOrientação a Objetos em Python
Orientação a Objetos em Python
 
Perl Moderno, dia2
Perl Moderno, dia2Perl Moderno, dia2
Perl Moderno, dia2
 
TDC2017 | Florianopolis - Trilha DevOps How we figured out we had a SRE team ...
TDC2017 | Florianopolis - Trilha DevOps How we figured out we had a SRE team ...TDC2017 | Florianopolis - Trilha DevOps How we figured out we had a SRE team ...
TDC2017 | Florianopolis - Trilha DevOps How we figured out we had a SRE team ...
 
(Portuguese) Java EE Poliglota
(Portuguese) Java EE Poliglota(Portuguese) Java EE Poliglota
(Portuguese) Java EE Poliglota
 
Java 05
Java 05Java 05
Java 05
 

Destaque

Porque aprender haskell me fez um programador python melhor?
Porque aprender haskell me fez um programador python melhor?Porque aprender haskell me fez um programador python melhor?
Porque aprender haskell me fez um programador python melhor?UFPA
 
Python simplecv
Python simplecvPython simplecv
Python simplecvUFPA
 
Tdd not sure if testing or developing
Tdd  not sure if testing or developingTdd  not sure if testing or developing
Tdd not sure if testing or developingRenato Oliveira
 
Wikilytics
WikilyticsWikilytics
Wikilyticspugpe
 
Qml + Python
Qml + PythonQml + Python
Qml + Pythonpugpe
 
Peça seu código em casamento: Votos, Tópicos e TDD
Peça seu código em casamento: Votos, Tópicos e TDDPeça seu código em casamento: Votos, Tópicos e TDD
Peça seu código em casamento: Votos, Tópicos e TDDRafael Carício
 
Python Debugger - PUG-PE
Python Debugger - PUG-PE Python Debugger - PUG-PE
Python Debugger - PUG-PE Arthur Alvim
 
Rain Toolbox - Previsão de Chuvas
Rain Toolbox -  Previsão de ChuvasRain Toolbox -  Previsão de Chuvas
Rain Toolbox - Previsão de Chuvaspugpe
 
Criando comunidades bem sucedidas
Criando comunidades bem sucedidasCriando comunidades bem sucedidas
Criando comunidades bem sucedidaspugpe
 
Pyjamas: Uma Ferramenta Pythônica para Web
Pyjamas: Uma Ferramenta Pythônica para WebPyjamas: Uma Ferramenta Pythônica para Web
Pyjamas: Uma Ferramenta Pythônica para WebNielson Santana
 
Blender Com Python
Blender Com PythonBlender Com Python
Blender Com Pythonpugpe
 
Python e Cadeias de Markov GHMM
Python e Cadeias de Markov GHMMPython e Cadeias de Markov GHMM
Python e Cadeias de Markov GHMMpugpe
 
Palestra sobre Inteligência Coletiva
Palestra sobre Inteligência ColetivaPalestra sobre Inteligência Coletiva
Palestra sobre Inteligência Coletivapugpe
 
Porque foi bom aprender com Python
Porque foi bom aprender com PythonPorque foi bom aprender com Python
Porque foi bom aprender com PythonFernando Rocha
 
Computação Científica com Python
Computação Científica com PythonComputação Científica com Python
Computação Científica com PythonHugo Serrano
 
(entregando djangoapps)@tangerinalab - pugpe xv
(entregando djangoapps)@tangerinalab - pugpe xv(entregando djangoapps)@tangerinalab - pugpe xv
(entregando djangoapps)@tangerinalab - pugpe xvraonyaraujo
 
Migrando do App Engine para o Heroku
Migrando do App Engine para o HerokuMigrando do App Engine para o Heroku
Migrando do App Engine para o HerokuFilipe Ximenes
 

Destaque (20)

Porque aprender haskell me fez um programador python melhor?
Porque aprender haskell me fez um programador python melhor?Porque aprender haskell me fez um programador python melhor?
Porque aprender haskell me fez um programador python melhor?
 
Python simplecv
Python simplecvPython simplecv
Python simplecv
 
Tdd not sure if testing or developing
Tdd  not sure if testing or developingTdd  not sure if testing or developing
Tdd not sure if testing or developing
 
Wikilytics
WikilyticsWikilytics
Wikilytics
 
Qml + Python
Qml + PythonQml + Python
Qml + Python
 
Peça seu código em casamento: Votos, Tópicos e TDD
Peça seu código em casamento: Votos, Tópicos e TDDPeça seu código em casamento: Votos, Tópicos e TDD
Peça seu código em casamento: Votos, Tópicos e TDD
 
Python Debugger - PUG-PE
Python Debugger - PUG-PE Python Debugger - PUG-PE
Python Debugger - PUG-PE
 
Rain Toolbox - Previsão de Chuvas
Rain Toolbox -  Previsão de ChuvasRain Toolbox -  Previsão de Chuvas
Rain Toolbox - Previsão de Chuvas
 
Criando comunidades bem sucedidas
Criando comunidades bem sucedidasCriando comunidades bem sucedidas
Criando comunidades bem sucedidas
 
Pyjamas: Uma Ferramenta Pythônica para Web
Pyjamas: Uma Ferramenta Pythônica para WebPyjamas: Uma Ferramenta Pythônica para Web
Pyjamas: Uma Ferramenta Pythônica para Web
 
Blender Com Python
Blender Com PythonBlender Com Python
Blender Com Python
 
Pep 8
Pep 8Pep 8
Pep 8
 
Arduino e python
Arduino e pythonArduino e python
Arduino e python
 
Python e Cadeias de Markov GHMM
Python e Cadeias de Markov GHMMPython e Cadeias de Markov GHMM
Python e Cadeias de Markov GHMM
 
Palestra sobre Inteligência Coletiva
Palestra sobre Inteligência ColetivaPalestra sobre Inteligência Coletiva
Palestra sobre Inteligência Coletiva
 
Porque foi bom aprender com Python
Porque foi bom aprender com PythonPorque foi bom aprender com Python
Porque foi bom aprender com Python
 
Computação Científica com Python
Computação Científica com PythonComputação Científica com Python
Computação Científica com Python
 
(entregando djangoapps)@tangerinalab - pugpe xv
(entregando djangoapps)@tangerinalab - pugpe xv(entregando djangoapps)@tangerinalab - pugpe xv
(entregando djangoapps)@tangerinalab - pugpe xv
 
Migrando do App Engine para o Heroku
Migrando do App Engine para o HerokuMigrando do App Engine para o Heroku
Migrando do App Engine para o Heroku
 
REST APIs com Django
REST APIs com DjangoREST APIs com Django
REST APIs com Django
 

Semelhante a Gerando bindings de bibliotecas C++ para Python

Python - Programando em alto nível
Python - Programando em alto nívelPython - Programando em alto nível
Python - Programando em alto nívelIgor Sobreira
 
Python Training #1, ed. 6
Python Training #1, ed. 6Python Training #1, ed. 6
Python Training #1, ed. 6Fabio Spanhol
 
Python Training #1 ed.6
Python Training #1 ed.6 Python Training #1 ed.6
Python Training #1 ed.6 Fabio Spanhol
 
Linguagem de Programação Python
Linguagem de Programação PythonLinguagem de Programação Python
Linguagem de Programação PythonJunior Sobrenome
 
Curso de Python (Básico) - Português
Curso de Python (Básico) - PortuguêsCurso de Python (Básico) - Português
Curso de Python (Básico) - PortuguêsHelio Colombe
 
Python Training #1 - ed5
Python Training #1 - ed5Python Training #1 - ed5
Python Training #1 - ed5Fabio Spanhol
 
Entendendo Frameworks web com Python
Entendendo Frameworks web com PythonEntendendo Frameworks web com Python
Entendendo Frameworks web com PythonLuiz Aldabalde
 
Entendendo Framework Web com Python
Entendendo Framework Web com PythonEntendendo Framework Web com Python
Entendendo Framework Web com PythonPythOnRio
 
Por Que Python - #PUGCE
Por Que Python - #PUGCEPor Que Python - #PUGCE
Por Que Python - #PUGCETiago Freire
 
Python para programadores Ruby
Python para programadores RubyPython para programadores Ruby
Python para programadores RubyEric Hideki
 
Python, a arma secreta do Google
Python, a arma secreta do GooglePython, a arma secreta do Google
Python, a arma secreta do GoogleLuciano Ramalho
 
Desenvolvimento web com python e django
Desenvolvimento web com python e djangoDesenvolvimento web com python e django
Desenvolvimento web com python e djangoIgor Sobreira
 
Introdução a linguagem Python
Introdução a linguagem PythonIntrodução a linguagem Python
Introdução a linguagem PythonLuciano Ramalho
 
Python-purple: Desenvolvendo bindings para Python usando o Cython
Python-purple: Desenvolvendo bindings para Python usando o CythonPython-purple: Desenvolvendo bindings para Python usando o Cython
Python-purple: Desenvolvendo bindings para Python usando o CythonBruno Abinader
 
Javascript para CSharpers 4 - POO
Javascript para CSharpers 4 - POOJavascript para CSharpers 4 - POO
Javascript para CSharpers 4 - POOWesley Lemos
 
Python: Cabe no seu bolso, cabe no seu micro, cabe no seu cérebro!
Python: Cabe no seu bolso, cabe no seu micro, cabe no seu cérebro!Python: Cabe no seu bolso, cabe no seu micro, cabe no seu cérebro!
Python: Cabe no seu bolso, cabe no seu micro, cabe no seu cérebro!iMasters
 
Cases de Python no 7Masters 2012
Cases de Python no 7Masters 2012Cases de Python no 7Masters 2012
Cases de Python no 7Masters 2012Rodrigo Senra
 
As Novidades Do C# 4.0 - NetPonto
As Novidades Do C# 4.0 - NetPontoAs Novidades Do C# 4.0 - NetPonto
As Novidades Do C# 4.0 - NetPontoPaulo Morgado
 
Minicurso Python
Minicurso PythonMinicurso Python
Minicurso Pythonrodrigopex
 
Minicurso Python
Minicurso PythonMinicurso Python
Minicurso Pythonguestac3de
 

Semelhante a Gerando bindings de bibliotecas C++ para Python (20)

Python - Programando em alto nível
Python - Programando em alto nívelPython - Programando em alto nível
Python - Programando em alto nível
 
Python Training #1, ed. 6
Python Training #1, ed. 6Python Training #1, ed. 6
Python Training #1, ed. 6
 
Python Training #1 ed.6
Python Training #1 ed.6 Python Training #1 ed.6
Python Training #1 ed.6
 
Linguagem de Programação Python
Linguagem de Programação PythonLinguagem de Programação Python
Linguagem de Programação Python
 
Curso de Python (Básico) - Português
Curso de Python (Básico) - PortuguêsCurso de Python (Básico) - Português
Curso de Python (Básico) - Português
 
Python Training #1 - ed5
Python Training #1 - ed5Python Training #1 - ed5
Python Training #1 - ed5
 
Entendendo Frameworks web com Python
Entendendo Frameworks web com PythonEntendendo Frameworks web com Python
Entendendo Frameworks web com Python
 
Entendendo Framework Web com Python
Entendendo Framework Web com PythonEntendendo Framework Web com Python
Entendendo Framework Web com Python
 
Por Que Python - #PUGCE
Por Que Python - #PUGCEPor Que Python - #PUGCE
Por Que Python - #PUGCE
 
Python para programadores Ruby
Python para programadores RubyPython para programadores Ruby
Python para programadores Ruby
 
Python, a arma secreta do Google
Python, a arma secreta do GooglePython, a arma secreta do Google
Python, a arma secreta do Google
 
Desenvolvimento web com python e django
Desenvolvimento web com python e djangoDesenvolvimento web com python e django
Desenvolvimento web com python e django
 
Introdução a linguagem Python
Introdução a linguagem PythonIntrodução a linguagem Python
Introdução a linguagem Python
 
Python-purple: Desenvolvendo bindings para Python usando o Cython
Python-purple: Desenvolvendo bindings para Python usando o CythonPython-purple: Desenvolvendo bindings para Python usando o Cython
Python-purple: Desenvolvendo bindings para Python usando o Cython
 
Javascript para CSharpers 4 - POO
Javascript para CSharpers 4 - POOJavascript para CSharpers 4 - POO
Javascript para CSharpers 4 - POO
 
Python: Cabe no seu bolso, cabe no seu micro, cabe no seu cérebro!
Python: Cabe no seu bolso, cabe no seu micro, cabe no seu cérebro!Python: Cabe no seu bolso, cabe no seu micro, cabe no seu cérebro!
Python: Cabe no seu bolso, cabe no seu micro, cabe no seu cérebro!
 
Cases de Python no 7Masters 2012
Cases de Python no 7Masters 2012Cases de Python no 7Masters 2012
Cases de Python no 7Masters 2012
 
As Novidades Do C# 4.0 - NetPonto
As Novidades Do C# 4.0 - NetPontoAs Novidades Do C# 4.0 - NetPonto
As Novidades Do C# 4.0 - NetPonto
 
Minicurso Python
Minicurso PythonMinicurso Python
Minicurso Python
 
Minicurso Python
Minicurso PythonMinicurso Python
Minicurso Python
 

Mais de Marcelo Lira

Mini-tutorial de GTK+
Mini-tutorial de GTK+Mini-tutorial de GTK+
Mini-tutorial de GTK+Marcelo Lira
 
Mantendo a Sanidade com o Glade
Mantendo a Sanidade com o GladeMantendo a Sanidade com o Glade
Mantendo a Sanidade com o GladeMarcelo Lira
 
Empacotamento Debian Básico
Empacotamento Debian BásicoEmpacotamento Debian Básico
Empacotamento Debian BásicoMarcelo Lira
 
Software Livre e Open Source
Software Livre e Open SourceSoftware Livre e Open Source
Software Livre e Open SourceMarcelo Lira
 

Mais de Marcelo Lira (6)

Mini-tutorial de GTK+
Mini-tutorial de GTK+Mini-tutorial de GTK+
Mini-tutorial de GTK+
 
Mantendo a Sanidade com o Glade
Mantendo a Sanidade com o GladeMantendo a Sanidade com o Glade
Mantendo a Sanidade com o Glade
 
Empacotamento Debian Básico
Empacotamento Debian BásicoEmpacotamento Debian Básico
Empacotamento Debian Básico
 
Workshop Python.2
Workshop Python.2Workshop Python.2
Workshop Python.2
 
Software Livre e Open Source
Software Livre e Open SourceSoftware Livre e Open Source
Software Livre e Open Source
 
Workshop Python.1
Workshop Python.1Workshop Python.1
Workshop Python.1
 

Gerando bindings de bibliotecas C++ para Python

  • 1. Gerando bindings de bibliotecas C++ para Python Marcelo Lira - setanta 1 de Outubro / São Paulo - SP
  • 2. Sobre o palestrante e seus overlords ˆ Desenvolvedor híbrido Python/C++ ˆ Membro da equipe principal do PySide ˆ INDT - Instituto Nokia de Tecnologia
  • 3. O Que Veremos Hoje ˆ Breve história ˆ Denição do problema ˆ Gerando bindings Mais uma iniciação que um tutorial.
  • 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. Genealogia do Gerador de Bindings
  • 6. O Problema Como usar bibliotecas C++ em Python?
  • 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
  • 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);
  • 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 objetos Binding C++: http://setantas.net/pages/bindingcpp.html
  • 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. 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. libshiboken ˆ libshiboken é a biblioteca de apoio para os bindings gerados pelo Shiboken. ˆ Licenciada sob a LGPL.
  • 16. 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
  • 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. 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. 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. 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. 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