123 votes

ctypes - Débutant

J'ai la tâche de "l'habillage" d'une bibliothèque c en python classe. Les docs sont incroyablement vague sur cette question. Il semble qu'ils attendent seulement avancé python utilisateurs de mettre en œuvre ctypes. Eh bien, je suis débutant en python et ont besoin d'aide.

Certains, étape par étape, de l'aide serait merveilleux.

Donc, j'ai mon c de la bibliothèque. Que dois-je faire? Quels fichiers dois-je les mettre où? Comment puis-je importer la bibliothèque? J'ai lu qu'il pourrait y avoir un moyen de "renvoi automatique à la ligne" à Python?

(En passant j'ai fait la ctypes tutoriel sur la python.net et ça ne fonctionne pas. Ce qui signifie que je suis en train de penser qu'ils sont en supposant que je devrais être en mesure de remplir le reste des étapes.

En fait, c'est l'erreur que j'obtiens avec leur code:

File "importtest.py", line 1
   >>> from ctypes import *
   SyntaxError: invalid syntax

J'ai vraiment besoin de quelque aide étape par étape sur ce! Merci~

253voto

Chinmay Kanchi Points 16353

Voici un moyen rapide et sale ctypes tutoriel.

Tout d'abord, écrivez votre C de la bibliothèque. Voici un simple exemple Hello world:

testlib.c

#include <stdio.h>

void myprint(void);

void myprint()
{
    printf("hello world\n");
}

Maintenant, le compiler en tant que bibliothèque partagée (mac trouvé de solution ici):

$ gcc -shared -Wl,-soname,testlib -o testlib.so -fPIC testlib.c

# or... for Mac OS X 
$ gcc -shared -Wl,-install_name,testlib.so -o testlib.so -fPIC testlib.c

Ensuite, écrire un wrapper à l'aide de ctypes:

testlibwrapper.py

import ctypes

testlib = ctypes.CDLL('/full/path/to/testlib.so')
testlib.myprint()

Maintenant l'exécuter:

$ python testlibwrapper.py

Et vous devriez voir la sortie

Hello world
$

Si vous disposez déjà d'une bibliothèque à l'esprit, vous pouvez ignorer la non-python partie du tutoriel. Assurez-vous que ctypes pouvez trouver à la bibliothèque en la mettant en /usr/lib ou un autre répertoire standard. Si vous faites cela, vous n'avez pas besoin de spécifier le chemin d'accès lors de l'écriture de l'emballage. Si vous choisissez de ne pas faire cela, vous devez fournir le chemin d'accès complet de la bibliothèque lors de l'appel d' ctypes.CDLL().

Ce n'est pas le lieu pour une analyse plus complète tutoriel, mais si vous demandez de l'aide avec les problèmes spécifiques à ce site, je suis sûr que la communauté devrait vous aider.

PS: je suis en supposant que vous êtes sur Linux parce que vous avez utilisé ctypes.CDLL('libc.so.6'). Si vous êtes sur un autre OS, les choses pourraient changer un peu (ou beaucoup).

13voto

Lennart Regebro Points 52510

Tout d'abord: L' >>> code que vous voyez dans python exemples est un moyen d'indiquer qu'il est le code Python. Il est utilisé pour séparer le code Python de la sortie. Comme ceci:

>>> 4+5
9

Ici, nous voyons que la ligne qui commence par >>> est le code Python, et 9 est ce qu'il en résulte. C'est exactement à quoi il ressemble si vous commencez un interpréteur Python, qui est pourquoi c'est fait comme ça.

Vous n'entrez jamais dans l' >>> part en .py le fichier.

Qui prend soin de votre erreur de syntaxe.

Deuxièmement, ctypes est juste un de plusieurs façons d'emballage de bibliothèques Python. D'autres moyens sont GORGÉE, qui va s'intéresser à votre bibliothèque Python et de générer un Python C module d'extension qui expose le C de l'API. Une autre façon est d'utiliser des Cython.

Ils ont tous des avantages et des inconvénients.

SWIG ne fera que révéler votre API C pour Python. Cela signifie que vous n'obtenez pas les objets ou quoi que ce soit, vous devrez faire un autre fichier Python le faire. Cependant, il est courant d'avoir un module appelé à dire "wowza" et une GORGÉE module appelé "_wowza" qui est le wrapper autour de l'API C. C'est un joli moyen facile de faire les choses.

Cython génère une C-Extension de fichier. Son avantage, c'est que tout le code Python que vous écrivez est fait en C, de sorte que les objets que vous écrivez sont également en C, qui peut être une amélioration de la performance. Mais vous aurez à apprendre comment il s'interface avec le C, donc c'est un peu de travail supplémentaire pour apprendre à l'utiliser.

ctypes ont l'avantage qu'il n'y a pas de code C pour compiler, il est donc très agréable à utiliser pour l'emballage standard des bibliothèques écrites par quelqu'un d'autre, et existe déjà dans les versions binaires pour Windows et OS X.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X