Essayez de créer un module Python en langage C

Essayez de créer un module Python en langage C

environnement

Python 3.4.6 gcc version 4.8.5 openSUSE Leap 42.3

Aperçu

Quand j'étudiais Python, j'ai trouvé un moyen de créer un module d'extension et j'ai décidé de le faire moi-même. Je suis personnellement resté coincé de différentes manières, alors je vais l'écrire ici au lieu d'une note.

Flux vers l'objectif

Créer un module Python en langage C ↓ Construire C en utilisant Python ↓ Essayez d'importer avec Python et d'utiliser le module C

Créer un module en langage C

Commençons par créer un module Python en langage C. Nous utilisons fortement le type PyObject. Pour le moment, j'ai fait Hello_world, push and pop.

practice.c


#include <Python.h>

//Les fonctions créées en C et utilisées en Python utilisent PyObject

static PyObject* 
hello_world (PyObject *self, PyObject *args) {
  printf("Hello_world\n");
  //Le retour de la fonction créée côté C est Py~~...Devient
  Py_RETURN_NONE;
}

static PyObject*
push(PyObject *self, PyObject *args){
  PyObject *p_list, *inthert_val, *receive_list;
  //Analyser la valeur envoyée
  if(!PyArg_ParseTuple(args, "O!i", &PyList_Type, &p_list, &inthert_val))
    return NULL;
  //Extraire la séquence
  receive_list = PySequence_List(p_list);
  //Ajouter de la valeur au tableau
  printf("%pousser d\n", inthert_val);
  PyList_Append(receive_list, Py_BuildValue("i", inthert_val));
  
  //Renvoyer le tableau
  return receive_list;
}

static PyObject*
pop (PyObject *self, PyObject *args){
  PyObject *p_list, *p_value;
  int size;
  long val;
  //Analyser la valeur envoyée
  if(!PyArg_ParseTuple(args, "O!", &PyList_Type, &p_list))
    return NULL;
  //Obtenir la taille de la liste
  size = PyList_Size(p_list);
  //Extraire la valeur
  p_value = PyList_GetItem(p_list, size - 1);
  val = PyLong_AsLong(p_value);
  printf("%pop d\n", val);

  //Valeur de retour
  return p_value;
}

//Définition de la méthode
static PyMethodDef PracticeMethods[] = {
  {"hello_world", (PyCFunction)hello_world, METH_NOARGS, "practice1: hello_world"},
  {"push", (PyCFunction)push, METH_VARARGS, "practice2: push"},
  {"pop", (PyCFunction)pop, METH_VARARGS, "practice3: pop"},
  //Indique la fin
  {NULL, NULL, 0, NULL}
};

//Définition du module
static struct PyModuleDef practicetmodule = {
  PyModuleDef_HEAD_INIT,
  "practice",
  NULL,
  -1,
  PracticeMethods
};

//Initialisation de la méthode
PyMODINIT_FUNC PyInit_practice (void) {
  return PyModule_Create(&practicetmodule);
}

Je mettrai la partie accro dans une balle. Tout ce que j'avais à faire était de le vérifier, mais cela a pris du temps.

Personnellement, c'était la meilleure porte démoniaque. Donc, si vous pouvez vous en sortir même ici, le reste sera facile.

Construire C en utilisant Python

Tel quel. Construisez C en utilisant Python. Plus précisément, utilisez la source suivante.

setup.py


from distutils.core import setup, Extension
setup(name='practice',
        version='1.0',
        ext_modules=[Extension('practice', ['practice.c'])]
)

Après l'avoir créé, exécutez la commande suivante pour le construire. Cette commande est utilisée lors des tests sans installer le module.

commander


python setup.py build_ext -i

Allons vérifier.

commander


ls

afficher


build  practice.c  practice.cpython-34m.so  setup.py

Vous avez maintenant un répertoire appelé build et un fichier appelé practice.cpython-34m.so. Ceci termine la construction.

Essayez d'importer avec Python et d'utiliser le module C

Je vais essayer de voir si cela peut réellement être utilisé. J'ai écrit le code suivant.

try_module.py


import practice as c_practice
#Tout d'abord, la vérification du fonctionnement
c_practice.hello_world()

# push
test_list = c_practice.push([50, 51, 52], 53)
print(test_list)

# pop
result = c_practice.pop(test_list)
print(result)

Je vais essayer.

production


Hello_world
Pousser 53
[50, 51, 52, 53]
Pop 53
53

Pour le moment, cela a fonctionné. C'était bien car cela prenait du temps.

Recommended Posts

Essayez de créer un module Python en langage C
J'ai fait un module en langage C qui filtre les images chargées par Python
Calculons en fait le problème statistique avec Python
Essayez de créer un code de "décryptage" en Python
Pour ajouter un module à python que vous mettez dans Julialang
Essayez de créer un groupe de dièdre avec Python
J'ai essayé d'ajouter un module Python 3 en C
Créer un bookmarklet en Python
Essayez de sélectionner une langue
Faisons un outil de veille de commande avec python
Essayez d'incorporer Python dans un programme C ++ avec pybind11
Pour ajouter un module C à MicroPython ...
ABC166 en Python A ~ C problème
Introduction à Protobuf-c (langage C ⇔ Python)
Essayez de calculer Trace en Python
Résoudre ABC036 A ~ C avec Python
Comment envelopper C en Python
Résoudre ABC037 A ~ C avec Python
Essayez de le faire avec GUI, PyQt en Python
J'ai fait un chronomètre en utilisant tkinter avec python
Je veux ajouter un joli complément à input () en python
Essayez simplement de recevoir un webhook avec ngrok et Python
Utilisez un langage de script pour une vie C ++ confortable-OpenCV-Port Python vers C ++ -
Résoudre ABC175 A, B, C avec Python
[Langage C] [Linux] Essayez de créer une simple commande Linux * Ajoutez simplement! !!
Essayez de vous connecter à qiita avec Python
[Python] Comment rendre une classe itérable
Essayez d'obtenir la liste des fils du bulletin d'information (je n'aime pas) avec Python.
Comment transformer une chaîne en tableau ou un tableau en chaîne en Python
Faisons un noyau jupyter
Essayez d'envoyer un paquet SYN en Python
Essayez de dessiner une animation simple en Python
Créer un diagramme de relations des modules Python
Comment obtenir stacktrace en python
Essayez de créer un type de service Web avec un langage de balisage 3D
[Langage C] Comment créer, éviter et créer un processus zombie
Module pour générer le mot N-gramme en Python
Générer un langage C à partir d'une expression S avec Python
Faisons un calcul de combinaison avec Python
Essayez un tube de programmation fonctionnel en Python
Essayez de créer quelque chose comme C # LINQ
Essayez de créer un logiciel de capture aussi précis que possible avec python (2)
[Python] Essayez de créer vous-même un programme de tri. (Tri sélectif, tri par insertion, tri par bulle)
[Python] [Word] [python-docx] Essayez de créer un modèle de phrase de mot en Python en utilisant python-docx
Notes J'ai recherché la création d'outils de ligne de commande en Python
Premiers pas pour essayer Google CloudVision en Python
Essayez d'implémenter Oni Mai Tsuji Miserable avec python
3.14 π jour, alors essayez de sortir en Python
Comment effacer un taple dans une liste (Python)
Essayez auto pour évaluer automatiquement Enum dans Python 3.6
Comment générer une séquence en Python et C ++
Comment incorporer des variables dans des chaînes python
Je veux créer une fenêtre avec Python
Porté un compilateur de langage homebrew naïf sur Python
Comment créer un fichier JSON en Python
Essayez de dessiner une courbe de vie avec python
Je veux faire un jeu avec Python
Méthode de contrôle exclusive multi-processus en langage C
Écriture de journaux dans un fichier CSV (Python, langage C)