gerando bindings de bibliotecas c++ para python
Post on 27-Jun-2015
2.048 Views
Preview:
DESCRIPTION
TRANSCRIPT
Gerando bindings de bibliotecasC++ para PythonMarcelo 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
� De�niçã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 <-> intstruct 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 modi�caçõ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 osbindings 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ãoinstanciáveis em Python
� Classes internas ao namespace aparecem como:
import sample
obj = sample.SampleNamespace.SomeClass()
Modi�caçõ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 debindings.
� Utilitário grá�co para edição atualização dosbindings.
� Bindings Python para a libapiextractor (casa deferreiro...).
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
top related