Python 3.4.6 gcc version 4.8.5 openSUSE Leap 42.3
Als ich Python studierte, hatte ich eine Möglichkeit, ein Erweiterungsmodul zu erstellen, und beschloss, es selbst zu erstellen. Ich persönlich bin auf verschiedene Weise festgefahren, deshalb schreibe ich es hier anstelle einer Notiz.
Erstellen Sie ein Python-Modul in der Sprache C. ↓ Erstellen Sie C mit Python ↓ Versuchen Sie, mit Python zu importieren und das C-Modul zu verwenden
Zuerst erstellen wir ein Python-Modul in C-Sprache. Wir verwenden stark den PyObject-Typ. Vorerst habe ich Hello_world gemacht, Push and Pop.
practice.c
#include <Python.h>
//In C erstellte und in Python verwendete Funktionen verwenden PyObject
static PyObject*
hello_world (PyObject *self, PyObject *args) {
printf("Hello_world\n");
//Die Rückgabe der auf der C-Seite erstellten Funktion ist Py~~...Wird
Py_RETURN_NONE;
}
static PyObject*
push(PyObject *self, PyObject *args){
PyObject *p_list, *inthert_val, *receive_list;
//Analysieren Sie den gesendeten Wert
if(!PyArg_ParseTuple(args, "O!i", &PyList_Type, &p_list, &inthert_val))
return NULL;
//Sequenz extrahieren
receive_list = PySequence_List(p_list);
//Wert zum Array hinzufügen
printf("%drücken Sie d\n", inthert_val);
PyList_Append(receive_list, Py_BuildValue("i", inthert_val));
//Geben Sie das Array zurück
return receive_list;
}
static PyObject*
pop (PyObject *self, PyObject *args){
PyObject *p_list, *p_value;
int size;
long val;
//Analysieren Sie den gesendeten Wert
if(!PyArg_ParseTuple(args, "O!", &PyList_Type, &p_list))
return NULL;
//Listengröße abrufen
size = PyList_Size(p_list);
//Wert extrahieren
p_value = PyList_GetItem(p_list, size - 1);
val = PyLong_AsLong(p_value);
printf("%Pop d\n", val);
//Rückgabewert
return p_value;
}
//Methodendefinition
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"},
//Zeigt das Ende an
{NULL, NULL, 0, NULL}
};
//Moduldefinition
static struct PyModuleDef practicetmodule = {
PyModuleDef_HEAD_INIT,
"practice",
NULL,
-1,
PracticeMethods
};
//Methodeninitialisierung
PyMODINIT_FUNC PyInit_practice (void) {
return PyModule_Create(&practicetmodule);
}
Ich werde den süchtigen Teil in eine Kugel stecken. Ich musste es nur überprüfen, aber es dauerte lange.
Persönlich war dies das beste Dämonentor. Wenn Sie also auch hier rüberkommen, wird der Rest einfach sein.
Wie es ist. Erstellen Sie C mit Python. Verwenden Sie insbesondere die folgende Quelle.
setup.py
from distutils.core import setup, Extension
setup(name='practice',
version='1.0',
ext_modules=[Extension('practice', ['practice.c'])]
)
Führen Sie nach dem Erstellen den folgenden Befehl aus, um es zu erstellen. Dieser Befehl wird beim Testen ohne Installation des Moduls verwendet.
Befehl
python setup.py build_ext -i
Lass uns nachsehen.
Befehl
ls
Anzeige
build practice.c practice.cpython-34m.so setup.py
Sie haben jetzt ein Verzeichnis mit dem Namen build und eine Datei mit dem Namen Practice.cpython-34m.so. Damit ist der Build abgeschlossen.
Ich werde versuchen zu sehen, ob es tatsächlich verwendet werden kann. Ich habe den folgenden Code geschrieben.
try_module.py
import practice as c_practice
#Zunächst die Überprüfung des Betriebs
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)
Ich werde es versuchen.
Ausgabe
Hello_world
53 drücken
[50, 51, 52, 53]
Pop 53
53
Vorerst hat es funktioniert. Es war gut, weil es ziemlich lange gedauert hat.
Recommended Posts