Python 3.4.6 gcc version 4.8.5 openSUSE Leap 42.3
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.
Créer un module Python en langage C ↓ Construire C en utilisant Python ↓ Essayez d'importer avec Python et d'utiliser le module 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.
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.
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