Tenho a tarefa de "envolver" a biblioteca ac em uma classe Python. Os documentos são incrivelmente vagos sobre esse assunto. Parece que eles esperam que apenas usuários avançados de python implementem ctypes. Bem, eu sou um iniciante em python e preciso de ajuda.
Alguma ajuda passo a passo seria maravilhosa.
Portanto, tenho minha biblioteca c. O que eu faço? Quais arquivos devo colocar onde? Como faço para importar a biblioteca? Eu li que pode haver uma maneira de "quebra automática" para Python.
(A propósito, eu fiz o tutorial ctypes em python.net e não funciona. O que significa que estou pensando que eles estão assumindo que devo ser capaz de preencher o restante das etapas.
Na verdade, este é o erro que recebo com o código deles:
File "importtest.py", line 1
>>> from ctypes import *
SyntaxError: invalid syntax
Eu realmente poderia usar alguma ajuda passo a passo nisso! Obrigado ~
fonte
>>>
arquivo em importtest.py? Quando as pessoas postam um código que possui>>>
em cada linha, isso significa que ele está sendo executado no shell interativo. Para executá-lo a partir de um arquivo, remova>>>
(são 3> sinais e um espaço) onde quer que apareça.>>>
s. Eles são impressos pelo shell interativo e devem ser deixados de fora do arquivo de origem.>>>
no arquivo .py! OUCH! Nunca vi isso antes!Respostas:
Aqui está um tutorial de ctypes rápido e sujo.
Primeiro, escreva sua biblioteca C. Aqui está um exemplo simples do Hello world:
testlib.c
Agora compile-o como uma biblioteca compartilhada ( mac fix encontrada aqui ):
Em seguida, escreva um wrapper usando ctypes:
testlibwrapper.py
Agora execute-o:
E você deve ver a saída
Se você já tem uma biblioteca em mente, pode pular a parte não Python do tutorial. Certifique-se de que ctypes pode encontrar a biblioteca colocando-a em
/usr/lib
ou em outro diretório padrão. Se você fizer isso, não será necessário especificar o caminho completo ao gravar o wrapper. Se você decidir não fazer isso, deverá fornecer o caminho completo da biblioteca ao ligarctypes.CDLL()
.Este não é o lugar para um tutorial mais abrangente, mas se você pedir ajuda com problemas específicos neste site, tenho certeza que a comunidade o ajudará.
PS: Presumo que você esteja no Linux porque já usou
ctypes.CDLL('libc.so.6')
. Se você estiver em outro sistema operacional, as coisas podem mudar um pouco (ou muito).fonte
A resposta de Chinmay Kanchi é excelente, mas eu queria um exemplo de função que passa e retorna variáveis / arrays para um código C ++. Pensei em incluí-lo aqui, caso seja útil para outros.
Passando e retornando um inteiro
O código C ++ para uma função que pega um número inteiro e adiciona um ao valor retornado,
Salvo como arquivo
test.cpp
, observe o "C" externo necessário (pode ser removido para o código C). Isso é compilado usando g ++, com argumentos semelhantes à resposta de Chinmay Kanchi,Os usos de código Python
load_library
danumpy.ctypeslib
assumindo que o caminho para a biblioteca compartilhada no mesmo diretório que o script Python,Isso imprime 6 conforme o esperado.
Passando e imprimindo uma matriz
Você também pode passar matrizes da seguinte forma, para um código C imprimir o elemento de uma matriz,
que é compilado como antes e importado da mesma maneira. O código Python extra para usar esta função seria,
onde especificamos o array, o primeiro argumento para
print_array
, como um ponteiro para um array Numpy de floats c_contiguous de 64 bits alinhados e o segundo argumento como um inteiro que informa ao código C o número de elementos no array Numpy. Isso então impresso pelo código C da seguinte maneira,fonte
import numpy as np
. Caso contrário, ele não é capaz de encontrarnp.float64
e outras coisas.Em primeiro lugar: o
>>>
código que você vê nos exemplos de Python é uma forma de indicar que é um código de Python. É usado para separar o código Python da saída. Como isso:Aqui, vemos que a linha que começa com
>>>
é o código Python e 9 é o que resulta. É exatamente assim que pareceria se você iniciar um interpretador Python, e é por isso que é feito assim.Você nunca insere a
>>>
peça em um.py
arquivo.Isso resolve seu erro de sintaxe.
Em segundo lugar, ctypes é apenas uma das várias maneiras de empacotar bibliotecas Python. Outras formas são SWIG , que examinará sua biblioteca Python e gerará um módulo de extensão Python C que expõe a API C. Outra forma é usar o Cython .
Todos eles têm vantagens e desvantagens.
SWIG irá apenas expor sua API C para Python. Isso significa que você não obtém nenhum objeto ou qualquer coisa, você terá que fazer um arquivo Python separado fazendo isso. No entanto, é comum ter um módulo chamado "wowza" e um módulo SWIG chamado "_wowza" que é o invólucro da API C. Esta é uma maneira fácil e agradável de fazer as coisas.
Cython gera um arquivo C-Extension. Tem a vantagem de que todo o código Python que você escreve é transformado em C, então os objetos que você escreve também estão em C, o que pode ser uma melhoria de desempenho. Mas você terá que aprender como ele faz interface com C, então é um pouco mais de trabalho aprender como usá-lo.
ctypes tem o benefício de não haver código C para compilar, então é muito bom usá-lo para empacotar bibliotecas padrão escritas por outra pessoa e já existe em versões binárias para Windows e OS X.
fonte