Qual é a maneira mais fácil de usar um DLL
arquivo de dentro Python
?
Especificamente, como isso pode ser feito sem escrever nenhum C++
código adicional para expor a funcionalidade Python
?
A Python
funcionalidade nativa é fortemente preferida ao usar uma biblioteca de terceiros.
Respostas:
Para facilitar o uso, ctypes é o caminho a percorrer.
O exemplo a seguir de ctypes é do código real que eu escrevi (no Python 2.5). Essa foi, de longe, a maneira mais fácil que encontrei para fazer o que você pede.
O
ctypes
material tem a todos os tipos de dados do tipo C (int
,char
,short
,void*
, e assim por diante) e pode passar por ou valor de referência. Ele também pode retornar tipos de dados específicos, embora meu exemplo não faça isso (a API da HLL retorna valores modificando uma variável passada por referência).Em termos do exemplo específico mostrado acima, o EHLLAPI da IBM é uma interface bastante consistente.
Todas as chamadas passam por quatro ponteiros nulos (o EHLLAPI envia o código de retorno de volta pelo quarto parâmetro, um ponteiro para um
int
so, enquanto eu especifiqueint
como o tipo de retorno, posso ignorá-lo com segurança) conforme a documentação da IBM aqui . Em outras palavras, a variante C da função seria:Isso cria uma
ctypes
função única e simples capaz de fazer tudo o que a biblioteca EHLLAPI fornece, mas é provável que outras bibliotecas precisem de umactypes
função separada configurada por função da biblioteca.O valor de retorno de
WINFUNCTYPE
é um protótipo de função, mas você ainda precisa configurar mais informações de parâmetro (acima e acima dos tipos). Cada tuplahllApiParams
possui um parâmetro "direção" (1 = entrada, 2 = saída e assim por diante), um nome de parâmetro e um valor padrão - consulte octypes
documento para obter detalhesDepois de obter as informações de protótipo e parâmetro, você pode criar um Python "callable"
hllApi
com o qual chamar a função. Você simplesmente cria a variável necessária (p1
atravésp4
do meu caso) e chama a função com eles.fonte
hllApiParams
? Qual é o sentido dessas tuplas? É difícil combinar algumas das coisas neste exemplo com a documentação.Esta página tem um exemplo muito simples de chamar funções de um arquivo DLL.
Parafraseando os detalhes aqui, para detalhes:
fonte
ctypes pode ser usado para acessar DLLs, aqui está um tutorial:
http://docs.python.org/library/ctypes.html#module-ctypes
fonte
Talvez com
Dispatch
:Onde zkemkeeper é um arquivo DLL registrado no sistema ... Depois disso, você pode acessar as funções apenas chamando-as:
fonte
Construindo uma DLL e vinculando-a no Python usando ctypes
Apresento um exemplo completo de como criar
shared library
e usá-loPython
por meio dectypes
. Eu considero oWindows
caso e tratoDLLs
. São necessárias duas etapas:A biblioteca compartilhada
O que
shared library
eu considero é o seguinte e está contido notestDLL.cpp
arquivo A única funçãotestDLL
apenas recebeint
e imprime.Criando a DLL a partir da linha de comando
Para criar um
DLL
com aVisual Studio
partir da linha de comando, executepara definir o caminho de inclusão e, em seguida, execute
para criar a DLL.
Construindo o
DLL
partir do IDEComo alternativa, o
DLL
pode ser construído usandoVisual Studio
o seguinte:Vinculando a DLL no Python
Em Python, faça o seguinte
fonte
ctypes será a coisa mais fácil de usar, mas (mis) usá-lo torna o Python sujeito a falhas. Se você está tentando fazer algo rapidamente e tem cuidado, é ótimo.
Eu encorajo você a conferir o Boost Python . Sim, requer que você escreva algum código C ++ e tenha um compilador C ++, mas na verdade não precisa aprender C ++ para usá-lo, e pode obter um compilador C ++ gratuito (como em cerveja) da Microsoft .
fonte
Se a DLL for do tipo COM library, você poderá usar pythonnet.
Em seguida, no seu código python, tente o seguinte
instancie um objeto conforme a classe na DLL e acesse os métodos nele.
fonte