Python C / C ++ - Erweiterungsmusterzeiger

Wie man einen Zeiger auf der C / C ++ - Seite in Python hat.

Etwas möchte eine C ++ - Klasse aus Python verwenden.

class Hello {
 public:
  void hello();
};

PyCapsule_New

Verwenden Sie PyCapsule_New, um einen C / C ++ - Zeiger als PyObject * zurückzugeben.

static void py_hello_free(PyObject *obj);

static PyObject* py_hello_alloc(PyObject *self, PyObject *args)
{
  // Allocate a new C++ pointer h as a Python object "_Hello"
  Hello* const h= new Hello();
  
  return PyCapsule_New(h, "_Hello", py_hello_free);
}

Wenn Sie eine Funktion übergeben, die den Zeiger freigibt, gibt Python ihn frei. Wenn Sie den Speicher auf der C / C ++ - Seite verwalten und ihn nicht freigeben müssen, können Sie NULL anstelle von py_hello_free übergeben.

void py_hello_free(PyObject *obj)
{
  // Destructor function for _Hello pointer, called automatically from Python
  Hello* const h= (Hello*) PyCapsule_GetPointer(obj, "_Hello");
    
  delete h;
}

PyCapsule_GetPointer

So kehren Sie zu einem C / C ++ - Zeiger PyCapsule_GetPointer zurück:

PyObject* py_hello(PyObject *self, PyObject *args)
{
  // Use _Hello pointer from Python
  PyObject* py_obj;
  
  if(!PyArg_ParseTuple(args, "O", &py_obj))
    return NULL;

  Hello* h= (Hello*) PyCapsule_GetPointer(py_obj, "_Hello");
  if(h == 0) return NULL;

  h->hello();

  Py_RETURN_NONE;
}

Der übliche Code für C / C ++ - Erweiterungen

#include <cstdio>
#include "Python.h"

// ...Code oben...

static PyMethodDef methods[] = {
  {"hello_alloc", py_hello_alloc, METH_VARARGS, "allocate a Hello object"},
  {"hello",       py_hello,       METH_VARARGS, "call hello() method"},
  {NULL, NULL, 0, NULL}
};

static struct PyModuleDef module = {
  PyModuleDef_HEAD_INIT,
  "cext02",              // name of this module
  "Use C/C++ pointer",  // Doc String
  -1,
  methods
};

PyMODINIT_FUNC
PyInit_cext02(void) {  
  return PyModule_Create(&module);
}

Die übliche setup.py

from distutils.core import setup, Extension

setup(name='cext02',
      version='0.0.1',
      description='c_ext02 pointer',
      author='Jun Koda',
      url='https://github.com/junkoda/python_c_ext',
      ext_modules=[
          Extension('cext02', ['cext02.cpp'])
      ]
)

kompilieren

$ python3 setup.py build_ext --inplace

Von Python

import cext02  #Erweiterung um C.
h = cext02.hello_alloc() # h = new Hello()Etwas wie
cext02.hello(h) # h->hello()Anruf

Verwenden Sie wie. (Wenn Sie es mit einer Python-Klasse umschließen, können Sie es natürlich wie ein Objekt verwenden.)

Referenz

Recommended Posts

Python C / C ++ - Erweiterungsmusterzeiger
Ich habe die C-Erweiterung von Python ausprobiert
Python C ++ Notizen
Python, openFrameworks (c ++)
Python C / C ++ - Erweiterungsmuster-Übergeben Sie Daten als np.array an Python
Weiter Python in C-Sprache
Berechnungsbohrpython (Erweiterung)
C-API in Python 3
ABC147 C --HonestOrUnkind2 [Python]
Erweitern Sie Python in C ++ (Boost.NumPy)
Geschwindigkeitsvergleich von Python, Java, C ++
C / C ++ - Programmierer fordert Python heraus (Class Edition)
ABC-Memorandum [ABC163 C --managementr] (Python)
Binäre Suche in Python / C ++
Mehrstufige Auswahl (C # / Python) (alt)
Implementieren Sie die Erweiterung in Python
Python wurde von C-Programmierern gestartet
Löse ABC163 A ~ C mit Python
Rufen Sie C von Python mit DragonFFI auf
Mehrstufige Auswahl (Go / C # / Ruby / Python)
Python
ABC127 A, B, C Erklärung (Python)
ABC166 in Python A ~ C Problem
Rufen Sie popcount von Ruby / Python / C # auf
Einführung in Protobuf-c (C-Sprache ⇔ Python)
Python-Spickzettel (für C ++ erfahren)
Löse ABC168 A ~ C mit Python
ABC-Memorandum [ABC161 C - Integer ersetzen] (Python)
Löse ABC036 A ~ C mit Python
Tipps zum Aufrufen von Python von C.
Führen Sie Python-Code über die C # -GUI aus
So verpacken Sie C in Python
ABC-Memorandum [ABC158 C - Steuererhöhung] (Python)
AtCoder ABC 114 C-755 mit Python3 gelöst
C / C ++ - Programmierer fordert Python heraus (erster Schritt)
Löse ABC162 A ~ C mit Python
Führen Sie Python-Skripte synchron von C # aus
Löse ABC167 A ~ C mit Python
ABC128 A, B, C Kommentar (Python)
Löse ABC158 A ~ C mit Python
ABC126 A, B, C Erklärung (Python)
Löse ABC037 A ~ C mit Python
Schreiben Sie einen C-Sprach-Unit-Test in Python
AtCoder Anfängerwettbewerb 174 C Problem (Python)
Rufen Sie C / C ++ von Python auf dem Mac auf
Rufen Sie die c-Sprache von Python aus auf (python.h)
Löse ABC175 A, B, C mit Python
Führen Sie Python-Code unter C ++ aus (mit Boost.Python).
Build-Umgebung für Python 2.7, 3.4, 3.5-Erweiterungsmodule unter Windows
4-Sprachen-Vergleich des Abschlusses (Python, JavaScript, Java, C ++)
Algorithmus in Python (ABC 146 C Dichotomie
Implementieren Sie den FIR-Filter in Python und C.
[C] [Python] Lesen mit AquesTalk unter Linux
Python> Schlüsselwortargumente> hoge (** {'a': 1, 'b': 2, 'c': 3})
Schreiben Sie die O_SYNC-Datei in C und Python
Doppelte Kombinationen auflisten (C ++) → Python-Code hinzufügen
Aufbau einer VScode-Umgebung (Windows 10, Python, C ++, C, Git)