ola galera primeiramente boa tarde a todos eu queria ajuda para compilar um codigo python em uma .dll no windows alguem pode me ajudar por favor to quebrando a cabeca com IA e nada
Fala meu caro, tudo certo e contigo?
Como assim em uma .ddl? pode ser mais especifico o que você quer fazer (pode ser no geral)
tudo certo entao mano eu quero compilar uma dll com meu codigo que ta escrito em python eu so usario do windows ja tentei varias IA para transformar os arquivo em cc+ pra compilar a dll mais nao deu certo
Por que DDL? você quer um arquivo executavel para rodar seu script em python igual um programa de windows?
porque preciso da dll e nao um .exe
Talvez o pypy ajude, mas mesmo assim o python é uma linguagem interpretada. Uma dll é por definição um arquivo binário para ser executado como biblioteca. Faz mais sentido portar o código python para outra linguagem que seja compilada, para daí sim gerar a dll.
tem tutorial ? eu agradeco
Quando o Deleterium disse portar o código, ele quis dizer para você reescrever seu código em outra linguagem (C# por ex) e incluir essa dll na hora de compilar o código.
Não tem como fazer, não sem hack, o que você precisa é de um binding:
DLL escrita em C que carrega o interpretador Python, lê seu script python e provê uma interface onde o programa envia tipos em C para DLL e seu binding passa para tipos python, chama as funções Python e devolve os valores em C, Krita faz isso
Mas tem um problema, isso é um antro pra falha de segurança, se não souber bem o que tá fazendo você transforma um programa seguro numa bomba termonuclear de segurança
Um “Hello World” para te situar, considere o seguinte script Python:
def saudacao(nome):
return f"Olá Mundo, meu nome é {nome}!"
Você quer expor na DLL a função que recebe uma string Python e devolve uma string C:
#define PY_SSIZE_T_CLEAN
#include <Python.h>
#include <windows.h>
// Aqui é como inicializar seu plugin
// Se o programa que você está consumindo
// A dll já usa plugins python você não faz isso
__declspec(dllexport)
int InicializarPython(void)
{
Py_Initialize();
if (!Py_IsInitialized())
return 0;
return 1;
}
__declspec(dllexport)
void FinalizarPython(void)
{
if (Py_IsInitialized())
Py_Finalize();
}
// Aqui a gente cria a casca C que chama a função python
__declspec(dllexport)
const char* ChamarSaudacao(const char* nome)
{
PyObject* module =
PyImport_ImportModule("script"); // O nome do seu script no PATH script vai aqui
PyObject* func =
PyObject_GetAttrString(module, "saudacao"); // Sua Função
PyObject* args = PyTuple_New(1);
// Esse 1 é quantos argumentos você vai passar para a função
// Seja estritamente rigoroso aqui, numero errado corrompe o estado
// do Python
PyTuple_SetItem(
args,
0, // Posição do argumento na tupla, precisa ser preciso, começa no 0
PyUnicode_FromString(nome) // Pega a String C e converte para String Python
);
// Chama a função python (burocracia)
PyObject* result =
PyObject_CallObject(func, args);
// Converte a string Python para a String C
static char respostaFuncao[1024]; // Tamano máximo da resposta, 1024 bytes
strcpy(respostaFuncao, PyUnicode_AsUTF8(result));
// Lembra de limpar aa memória, Python faz isso sozio, mas você
// Está em C
Py_DECREF(result);
Py_DECREF(args);
Py_DECREF(func);
Py_DECREF(module);
// Finalmente devolva a resposta em C
return respostaFuncao;
}
Lembra de que C tem cabeçalhos separados, vai precisar disso:
#ifndef BINDING_H
#define BINDING_H
__declspec(dllexport) int InicializarPython(void);
__declspec(dllexport) void FinalizarPython(void);
// A função casca que expõe sua função Python, uma linha por função
__declspec(dllexport) char* ChamarSaudacao(const char* nome);
#endif
De novo, isso é perigoso se você não sabe C, Lua tem um monte de salvaguardas para evitar problemas que Python não tem, recomendo começar com Lua para pegar o conceito e depois aplicar em C
Esse exemplo é extremamente básico, ele não cobre o GIL ou módulos por exemplo
Seria bom se você pudesse explicar o que está tentando realizar, em vez de como realizar. um DLL é um meio para um fim, mas talvez não seja a melhor abordagem.
Tirando esse ponto, é uma prática comum na industria, a abordagem mais “genérica” é usar cython que possui a ferramentaria para lidar com tipos (libcpp, numpy, etc) ter algumas proteções em alocação (cython.boundscheck) e lidar com o GIL ( PyGILState_Ensure/Release).
A documentação é meio densa, mas não é um grande mistério, o problema é que exige um bocado de fundamentos que você precisa ter bem construídos sobre boas práticas em C/C++/python e código em geral para entender o que é má ideia fazer ou não. Por exemplo a maioria dos projetos, se possível, simplesmente tira o GIL da equação, parte para multi-processos.
Eu diria que, se você não tentar usar CPython C API direto, e se você estiver conectando com C++, pode ser que seja relativamente tranquilo para você, já que ha uma gestão um pouco mais moderna de alocação com RAII . O maior problema é C e a contabilidade 100% manual de alocação de memória.
eu consegui transformar codigo python em .exe e agora como faz para transformar em .dll ?
Como transformou o código python em .exe?
Você não quer transformar em .exe, você simplesmente quer compilar os object files e linkar eles em uma biblioteca em vez de um executável. Você quer algo provavelmente como:
cython facade.pyx
cl /c facade.c /I C:\Python312\include
# ... e assim por diante para outros códigos fontes envolvidos
link /DLL facade.obj <e-outros-obj> /LIBPATH:C:\Python312\libs python312.lib /OUT:facade.dll
# E aqui um exemplo usando esta DLL para compilar um programa terceiro na história
cl /c host.c /I C:\Python312\include
link host.obj facade.lib /OUT:host.exe
A linkagem do Python pode variar, e pode ser que você encontre alguns problemas se não alinhar bem com o python do ambiente (mesma versão, arquitetura, etc). Dependendo do objetivo, o desenvolvedor as vezes distribui o python embutido para evitar exatamente isso.
Obs: obviamente você vai precisar que algum arquivo .c envolvido seja o seu bootstrap (quem da a partida no interpretador).
obs2: teria que investigar, eu costumo apenas usar cython para puxar C para dentro do python mas provavelmente a forma mais elegante, que não envolve escrever um bootstrap, seria usar cython --embed facade.pyx
alguem sabe como converter .exe em .dll 32bits ?
O que você está tentando fazer? como eu disse lá em cima, a melhor coisa que você pode fazer é explicar o que está tentando fazer, para vermos se faz minimamente sentido.
Não faz sentido
Isso nem faz sentido. O .exe é literalmente o arquivo executável, as dll são bibliotecas normalmente.
alguem me ajuda como criar um arquivo.bat e fecha todos propomt de comando no windows 10