pybind11 — Operabilidade perfeita entre C++11 e Python
Exemplo de Setuptools • Exemplo de Scikit-build • Exemplo de CMake
pybind11 é uma biblioteca leve somente de cabeçalho que expõe tipos C++ em Python e vice-versa, principalmente para criar ligações Python de código C++ existente. Seus objetivos e sintaxe são semelhantes aos da excelente biblioteca Boost.Python de David Abrahams: minimizar o código padrão em módulos de extensão tradicionais, inferindo informações de tipo usando introspecção em tempo de compilação.
O principal problema do Boost.Python – e o motivo para criar um projeto tão semelhante – é o Boost. Boost é um conjunto enorme e complexo de bibliotecas utilitárias que funciona com quase todos os compiladores C++ existentes. Essa compatibilidade tem seu custo: truques misteriosos e soluções alternativas são necessários para suportar os espécimes de compilador mais antigos e com mais bugs. Agora que os compiladores compatíveis com C++ 11 estão amplamente disponíveis, esse maquinário pesado tornou-se uma dependência excessivamente grande e desnecessária.
Pense nesta biblioteca como uma pequena versão independente do Boost.Python com tudo removido que não é relevante para a geração de ligação. Sem comentários, os arquivos de cabeçalho principais requerem apenas cerca de 4K linhas de código e dependem do Python (3.8+ ou PyPy) e da biblioteca padrão C++. Esta implementação compacta foi possível graças a alguns recursos da linguagem C++ 11 (especificamente: tuplas, funções lambda e modelos variados). Desde a sua criação, esta biblioteca cresceu além do Boost.Python de várias maneiras, levando a um código de ligação dramaticamente mais simples em muitas situações comuns.
O tutorial e a documentação de referência são fornecidos em pybind11.readthedocs.io. Uma versão em PDF do manual está disponível aqui. E o código-fonte está sempre disponível em github.com/pybind/pybind11.
pybind11 pode mapear os seguintes recursos principais do C++ para Python:
std::shared_ptr
Além da funcionalidade principal, o pybind11 oferece algumas vantagens extras:
constexpr
), levando a binários menores.Este projeto foi criado por Wenzel Jakob. Recursos e/ou melhorias significativas no código foram contribuídos por Jonas Adler, Lori A. Burns, Sylvain Corlay, Eric Cousineau, Aaron Gokaslan, Ralf Grosse-Kunstleve, Trent Houliston, Axel Huebl, @hulucc, Yannick Jadoul, Sergey Lyskov, Johan Mabille, Tomasz Miąsko, Dean Moldovan, Ben Pritchard, Jason Rhinelander, Boris Schäling, Pim Schelart, Henry Schreiner, Ivan Smirnov, Boris Staletic e Patrick Stewart.
Agradecemos ao Google pela generosa contribuição financeira para a infraestrutura de integração contínua utilizada neste projeto.
Consulte o guia de contribuição para obter informações sobre como construir e contribuir para o pybind11.
pybind11 é fornecido sob uma licença estilo BSD que pode ser encontrada no arquivo LICENSE. Ao usar, distribuir ou contribuir para este projeto, você concorda com os termos e condições desta licença.