Pointeur de modèle d'extension Python C / C ++

Comment avoir un pointeur côté C / C ++ en Python.

Quelque chose veut utiliser une classe C ++ de Python.

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

PyCapsule_New

Utilisez PyCapsule_New pour renvoyer un pointeur C / C ++ comme PyObject *.

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);
}

Si vous passez une fonction qui libère le pointeur, Python le publiera. Si vous gérez la mémoire côté C / C ++ et n'avez pas besoin de la libérer, vous pouvez passer NULL au lieu de py_hello_free.

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

Pour revenir à un pointeur C / C ++ PyCapsule_GetPointer:

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;
}

Le code habituel qui crée des extensions C / C ++

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

// ...Code ci-dessus...

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);
}

Le setup.py habituel

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'])
      ]
)

compiler

$ python3 setup.py build_ext --inplace

De Python

import cext02  #Extension par C
h = cext02.hello_alloc() # h = new Hello()Quelque chose comme
cext02.hello(h) # h->hello()Appel

Utilisez comme. (Bien sûr, si vous l'enveloppez avec une classe Python, vous pouvez l'utiliser comme un objet.)

référence

Recommended Posts

Pointeur de modèle d'extension Python C / C ++
J'ai essayé l'extension C de Python
notes de python C ++
python, openFrameworks (c ++)
Modèle d'extension Python C / C ++ - Passez des données à Python en tant que np.array
Next Python en langage C
Exercice de calcul Python (extension)
API C en Python 3
ABC147 C --HonestOrUnkind2 [Python]
Étendre python en C ++ (Boost.NumPy)
Comparaison de vitesse de Python, Java, C ++
Un programmeur C / C ++ défie Python (édition de classe)
Mémorandum ABC [ABC163 C --managementr] (Python)
Recherche binaire en Python / C ++
Sélection en plusieurs étapes (C # / Python) (ancien)
Implémenter l'extension en Python
Python lancé par des programmeurs C
Résoudre ABC163 A ~ C avec Python
Appeler C depuis Python avec DragonFFI
Sélection en plusieurs étapes (Go / C # / Ruby / Python)
Python
Explication ABC127 A, B, C (python)
ABC166 en Python A ~ C problème
Appeler popcount depuis Ruby / Python / C #
Introduction à Protobuf-c (langage C ⇔ Python)
Aide-mémoire Python (pour les expérimentés C ++)
Résoudre ABC168 A ~ C avec Python
Mémorandum ABC [ABC161 C --Replacing Integer] (Python)
Résoudre ABC036 A ~ C avec Python
Conseils pour appeler Python à partir de C
Exécuter du code Python à partir de l'interface graphique C #
Comment envelopper C en Python
Mémorandum ABC [ABC158 C - Augmentation de la taxe] (Python)
Résolu AtCoder ABC 114 C-755 avec Python3
Un programmeur C / C ++ défie Python (première étape)
Résoudre ABC162 A ~ C avec Python
Exécutez des scripts Python de manière synchrone à partir de C #
Résoudre ABC167 A ~ C avec Python
ABC128 Commentaire A, B, C (python)
Résoudre ABC158 A ~ C avec Python
Explication ABC126 A, B, C (python)
Résoudre ABC037 A ~ C avec Python
Ecrire un test unitaire de langage C en Python
AtCoder Beginner Contest 174 C Problème (Python)
Appeler C / C ++ depuis Python sur Mac
Appeler le langage C depuis Python (python.h)
Résoudre ABC175 A, B, C avec Python
Exécuter du code Python sur C ++ (en utilisant Boost.Python)
Environnement de création de module d'extension Python 2.7, 3.4, 3.5 sous Windows
4 langage de comparaison de fermeture (Python, JavaScript, Java, C ++)
Algorithme en Python (ABC 146 C Dichotomy
Implémenter le filtre FIR en langage Python et C
[C] [python] Lire avec AquesTalk sous Linux
python> Arguments de mot clé> hoge (** {'a': 1, 'b': 2, 'c': 3})
Ecrire le fichier O_SYNC en C et Python
Énumérer les combinaisons en double (C ++) → Ajouter du code Python
Construction de l'environnement VScode (Windows10, Python, C ++, C, Git)