Python C API

Un article de Haypo.

Retour à la page précédente Retour aux langages de programmation

Python C API est la bibliothèque utilisée pour écrire des modules Python en C, c'est-à-dire pour CPython, l'implémentation Python standard. Personnelement, je préfère écrire des modules avec ctypes.

Lire la documentation Python C API de référence.

[modifier] Types

  • PyString_FromString(const char *str) : crée un objet PyString à partir d'une chaîne C

[modifier] PyArg_ParseTuple()

  • Prototype : PyArg_ParseTuple(args, "format", ...)
  • Format : "entrée:sortie"
    • "i" : entier
    • "s" : chaîne de caractère => char*
    • "s#" : chaîne de caractère et longueur => (char*, int)
    • "S" : chaîne de caractère sous forme d'objet PyString => PyStringObject*
    • "O" : objet Python => PyObject*
  • Exemple :
int x; 
if (!PyArg_ParseTuple(args, "i", &x))
   return NULL;

[modifier] Ajouter une fonction à un module

Squelette d'un module, exemple avec le module « crypto » de pyopenssl :

#define crypto_MODULE
static char crypto_doc[] = "...";

static char crypto_X509_verify_cert_error_string_doc[] = "(...)"; 
static PyObject *
crypto_X509_verify_cert_error_string(PyObject *spam, PyObject *args)
{
    ...
}

static PyMethodDef crypto_methods[] = {
    ...
    { "X509_verify_cert_error_string", 
       (PyCFunction)crypto_X509_verify_cert_error_string, 
       METH_VARARGS, 
       crypto_X509_verify_cert_error_string_doc },
   { NULL, NULL }
};

void
initcrypto(void)
{
   if ((module = Py_InitModule3("crypto", crypto_methods, crypto_doc)) == NULL)
      return;
}

Pour ajouter une fonction, il faut modifier crypto_methods et ajouter une ligne. La fonction ajoutée, ici crypto_X509_verify_cert_error_string, reçoit NULL en premier argument.