Versuchen Sie, ein Python-Modul in C-Sprache zu erstellen

Versuchen Sie, ein Python-Modul in C-Sprache zu erstellen

Umgebung

Python 3.4.6 gcc version 4.8.5 openSUSE Leap 42.3

Überblick

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.

Fließ zum Ziel

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

Modul in C-Sprache erstellen

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.

Erstellen Sie C mit Python

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.

Versuchen Sie, mit Python zu importieren und das C-Modul zu verwenden

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

Versuchen Sie, ein Python-Modul in C-Sprache zu erstellen
Ich habe ein Modul in C-Sprache erstellt, das von Python geladene Bilder filtert
Berechnen wir das statistische Problem mit Python
Versuchen Sie, in Python einen "Entschlüsselungs" -Code zu erstellen
So fügen Sie Python ein Modul hinzu, das Sie in Julialang eingefügt haben
Versuchen Sie, mit Python eine Diedergruppe zu bilden
Ich habe versucht, ein Python 3-Modul in C hinzuzufügen
Erstellen Sie ein Lesezeichen in Python
Versuchen Sie, eine Sprache auszuwählen
Lassen Sie uns ein Befehls-Standby-Tool mit Python erstellen
Versuchen Sie, Python mit pybind11 in ein C ++ - Programm einzubetten
So fügen Sie MicroPython ein C-Modul hinzu ...
ABC166 in Python A ~ C Problem
Einführung in Protobuf-c (C-Sprache ⇔ Python)
Versuchen Sie, Trace in Python zu berechnen
Löse ABC036 A ~ C mit Python
So verpacken Sie C in Python
Löse ABC037 A ~ C mit Python
Versuchen Sie es mit GUI, PyQt in Python
Ich habe eine Stoppuhr mit tkinter mit Python gemacht
Ich möchte eine schöne Ergänzung zu input () in Python hinzufügen
Versuchen Sie einfach, einen Webhook mit ngrok und Python zu erhalten
Verwenden Sie eine Skriptsprache für ein komfortables C ++ - Leben - OpenCV-Port Python zu C ++ -
Löse ABC175 A, B, C mit Python
[C-Sprache] [Linux] Versuchen Sie, einen einfachen Linux-Befehl zu erstellen. * Fügen Sie einfach hinzu! !!
Versuchen Sie, sich mit Python bei qiita anzumelden
[Python] Wie man eine Klasse iterierbar macht
Versuchen Sie, die Thread-Liste der Nachrichten (Abneigung) mit Python zu erhalten.
So machen Sie einen String in Python zu einem Array oder ein Array zu einem String
Machen wir einen Jupyter-Kernel
Versuchen Sie, ein SYN-Paket in Python zu senden
Versuchen Sie, eine einfache Animation in Python zu zeichnen
Erstellen Sie ein Beziehungsdiagramm von Python-Modulen
Wie bekomme ich Stacktrace in Python?
Versuchen Sie, einen Web-Service-ähnlichen Typ mit 3D-Markup-Sprache zu erstellen
[C-Sprache] So erstellen, vermeiden und erstellen Sie einen Zombie-Prozess
Modul zum Generieren des Wortes N-Gramm in Python
Generieren Sie mit Python eine C-Sprache aus dem S-Ausdruck
Lassen Sie uns eine Kombinationsberechnung mit Python durchführen
Probieren Sie eine funktionale Programmierpipe in Python aus
Versuchen Sie etwas wie C # LINQ zu machen
Versuchen Sie, mit Python (2) eine Erfassungssoftware zu erstellen, die so genau wie möglich ist.
[Python] Versuchen Sie, selbst ein Sortierprogramm zu erstellen. (Selektive Sortierung, Sortierung einfügen, Blasensortierung)
[Python] [Word] [python-docx] Versuchen Sie, mit python-docx eine Vorlage für einen Wortsatz in Python zu erstellen
Hinweise Ich habe nachgeschlagen, um Befehlszeilentools in Python zu erstellen
Erste Schritte zum Testen von Google CloudVision in Python
Versuchen Sie, Oni Mai Tsuji Miserable mit Python zu implementieren
3,14 π Tag, versuchen Sie also, in Python auszugeben
So löschen Sie einen Taple in einer Liste (Python)
Versuchen Sie automatisch, Enum in Python 3.6 automatisch zu bewerten
So generieren Sie eine Sequenz in Python und C ++
Einbetten von Variablen in Python-Strings
Ich möchte mit Python ein Fenster erstellen
Portierte einen naiven Homebrew-Sprachcompiler nach Python
So erstellen Sie eine JSON-Datei in Python
Versuchen Sie, mit Python eine Lebenskurve zu zeichnen
Ich möchte ein Spiel mit Python machen
So steuern Sie Multiprozesse ausschließlich in C-Sprache
Schreiben von Protokollen in eine CSV-Datei (Python, C-Sprache)