Aprenda a Criar Bibliotecas pra Python com C/C++

Simples e rápido!


Aprenda a Criar Bibliotecas pra Python com C/C++


🔊 As bibliotecas de diversas linguagens de programação são escritas em C e C++. Nesse vídeo veremos como fazer isso em C++ para Python.


Assista ao Vídeo


Códigos criados no vídeo

Arquivo com os exemplos criados:

Arquivo main.cpp:

#include <Python.h>

int world(){
  printf("Olá, Mundo!\n");
  return 0;
}

int add(int x, int y){
  return x + y;
}

int print(const char* str){
  printf("%s", str);
  return 0;
}

static PyObject* world(PyObject* self, PyObject* args){
  return Py_BuildValue("s", world());
}

static PyObject* print(PyObject* self, PyObject* args){
  const char* z;
  if(!PyArg_ParseTuple(args, "s", &z)){
    return NULL;
  }
  return Py_BuildValue("s", print(z));
}

static PyObject* add(PyObject* self, PyObject* args){
  int a, b;
  if(!PyArg_ParseTuple(args, "ii", &a, &b)){
    return NULL;
  }
  return Py_BuildValue("i", add(a, b));
}

static PyMethodDef hello_methods[] = {
  {"world", world, METH_VARARGS, "Print Hello World"},
  {"add", add, METH_VARARGS, "Add two numbers."},
  {"print", print, METH_VARARGS, "Print string"},
  {NULL, NULL, 0, NULL}
};

static struct PyModuleDef hello_module = {
  PyModuleDef_HEAD_INIT,
  "hello",
  NULL,
  -1,
  hello_methods
};

PyMODINIT_FUNC PyInit_hello(void){
  return PyModule_Create(&hello_module);
}

Código Python criado:

script.py

import hello

hello.world()

num1 = 36 
num2 = 90

print(hello.add(num1, num2))

hello.print("Olá, amigo somente\n")

Compile:

g++ -shared -o hello.so -fpic main.cpp -I /usr/include/python* # Altere pra versão que há no seu sistema

Rode:

python script.py


Compilando a playmp3:

1. Certifique-se antes de possuir as dependências:

Exemplo no Ubuntu

sudo apt install libmpg123-dev libao-dev libasound2

2. Copie e crie os arquivos(playmp3.hpp e playmp3.cpp) da postagem do vídeo da playmp3 disponível no endereço:

🎶 Como Tocar MP3 com C++ 🎻 🎼 Code Music

3. Crie o main.cpp e adicione o código abaixo:

#include <Python.h>
#include "playmp3.hpp"

int mp3(char* song){
  auto p = std::make_unique<PlayMP3>();
  p->music(song);
  p->play();
  return 0;
}

static PyObject* mp3(PyObject* self, PyObject* args){
  char* music;
  if (!PyArg_ParseTuple(args, "s", &music)) {
    return NULL;
  }
  mp3(music);
  return Py_BuildValue("");
}

static PyMethodDef playmp3_methods[] = {
  {"mp3", mp3, METH_VARARGS, "Play MP3"},
  {NULL, NULL, 0, NULL}
};

static struct PyModuleDef playmp3_module = {
  PyModuleDef_HEAD_INIT,
  "playmp3",
  NULL,
  -1,
  playmp3_methods
};

PyMODINIT_FUNC PyInit_playmp3(void) {
  return PyModule_Create(&playmp3_module);
}

4. Adicione o caminho da libalsa.so à variável de ambiente: LD_LIBRARY_PATH:

echo export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:$(dirname "$(find /usr/lib* -name "libalsa.so" 2>/dev/null)") >> ~/.bashrc

5. Feche e abra o terminal ou rode o comando abaixo:

source ~/.bashrc

6. Compile:

g++ -shared -o playmp3.so -fpic main.cpp playmp3.cpp \
  -I /usr/include/python* \ # Altere para o caminho que há no seu sistema
  -lmpg123 -lao $(find /usr/lib* -name "libalsa.so")

7. Crie um arquivo Python: player.py

import playmp3 as play 
play.mp3("music.mp3")

Em music.mp3 substitua pela música que deseja escutar!

8. Depois é só rodar:

python player.py

Se quiser utilizar a biblioteca diretamente no seu sistema:

sudo mv playmp3.so /usr/local/lib
echo 'export PYTHONPATH="${PYTHONPATH}:/usr/local/lib"' >> ~/.bashrc

Se quiser usar um plugin de saída diferente para o libao, como o plugin “oss” (Open Sound System), use:

export AO_DRIVER=oss
python player.py

Aprenda C++:

https://terminalroot.com.br/cpp


cpp python linguagemc


Compartilhe


Nosso canal no Youtube

Inscreva-se


Marcos Oliveira

Marcos Oliveira

Desenvolvedor de software
https://github.com/terroo

Artigos Relacionados




Crie Aplicativos Gráficos para Linux e Windows com C++

Aprenda C++ Moderno e crie Games, Programas CLI, GUI e TUI de forma fácil.

Saiba Mais

Receba as novidades no seu e-mail!

Após cadastro e confirmação do e-mail, enviaremos semanalmente resumos e também sempre que houver novidades por aqui para que você mantenha-se atualizado!