Appeler le langage C depuis Python (python.h)

introduction

Il y a environ un demi-mois, un fichier résumant le module wrapper de python.h est sorti, je vais donc le poster. À propos, il a été créé pour Raspberry Pi3.

Méthode

Le langage C a un en-tête appelé python.h, qui peut être utilisé pour l'implémentation. Le programme crée une fonction en langage c et appelle la fonction en python par un module wrapper appelé wrapper python.

version python

En python2 et 3, c'était différent de ce que j'avais imaginé, donc je posterai la méthode de création de chacun. Il n'y a aucune différence dans les fonctions du langage C.

À propos de l'exemple de programme

Même si vous regardez l'exemple de programme, vous verrez "Quoi? Qu'est-ce que c'est?" .. .. Lol J'écrirai ce que j'ai compris comme une note supplémentaire à la fin autant que possible, donc j'espère que vous le verrez si vous êtes intéressé après avoir vu l'exemple de programme. De plus, l'environnement cette fois-ci est le Raspberry Pi3. Les fonctions et les modules wrapper sont des fichiers séparés. (Le même fichier est plus facile et plus facile)

Exemple de programme

・ Fonction de langage C

#include <iostream>

void numPrint(int num){
	std::cout << num << std::endl
}

compiler $ g++ -Wall -pthread -fpic -o intPrint.o -c intPrint.cpp -lpigpiod_if2 -lrt

・ Python2.7

#include <Python.h>

extern void numPrint(int num);

PyObject *numPrint(PyObject* self, PyObject* args){
	int num;

	if(!PyArg_ParseTuple(args, "i", &num)) return NULL;
	numPrint(num);
	return Py_Buildvalue("");
}

static PyMethodDef numPrintmethods[]={
	{"numPrint",numPrint ,METH_VARARGS},
	{NULL,NULL,0},
};

PyMODINIT_FUNC initPWM(void){
	Py_InitModule("numPrint",numPrintmethods);
}

compiler $ g++ -fpic -I/usr/include/python2.7 -o intPrintWrapper.o -c intPrintWrapper.cpp -lpigpiod_if2 -lrt $ g++ -shared intPrint.o intPrintWrapper.o -o intPrintmodule.so -lpigpiod_if2 –lrt

・ Python3.4

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

extern void numPrint(int num);

PyObject *numPrint(PyObject* self, PyObject* args){
	int num;

	if(!PyArg_ParseTuple(args, "i", &num)) return NULL;
	numPrint(num);
	return Py_Buildvalue("");
}

static PyMethodDef numPrintmethods[]={
	{"numPrint",numPrint ,METH_VARARGS ,NULL},
	{NULL,NULL, 0, NULL},
};

static PyModuleDef numPrintmodule = {
	PyModuleDef_HEAD_INIT,
	"numPrint",
	NULL,
	-1,
	numPrintmethods
};

PyMODINIT_FUNC PyInit_numPrint(void){
	return PyModule_Create(&numPrintmodule);
}

compiler $ arm-linux-gnueabihf-gcc -pthread -DNDEBUG -g -fwrapv -O2 -Wall -Wstrict-prototypes -g -fstack-protector-strong -Wformat -Werror=format-security -D_FORTIFY_SOURCE=2 -fPIC -I/usr/include/python3.4m -c intPrintWrapper.cpp -o intPrintWrapper.o $ arm-linux-gnueabihf-g++ -pthread -shared intPrint.o -Wl,-O1 -Wl,-Bsymbolic-functions -Wl,-z,relro -Wl,-z,relro -g -fstack-protector-strong -Wformat -Werror=format-security -D_FORTIFY_SOURCE=2 intPrintWrapper.o -o intPrint.cpython-34m.so -lpigpiod_if2 -lrt (* Je pense que certains d'entre eux ne sont pas nécessaires. ・ Faites attention au nom du fichier et à l'emplacement du dossier.)

Postscript

○ Ajout ・ Table des matières simple À propos de PyObject / À propos de PyModuleDef / Rendre le module disponible ailleurs / Implémenter dans le même fichier / Implémenter en classe /

● À propos de PyObject PyObject n'a pas changé dans la version python (je pense)

-Dans cet article, il n'y a qu'un seul argument, mais dans d'autres cas, Sans arguments

PyObject *numPrint(PyObject* self, PyObject* args){
	numPrint();
	return Py_Buildvalue("");
}

Deux arguments

PyObject *numPrint(PyObject* self, PyObject* args){
	int num, num2;

	if(!PyArg_ParseTuple(args, "ii", &num, &num2)) return NULL;
	numPrint(num, num2);
	return Py_Buildvalue("");
}

Il devient.

・ À propos des arguments 20180306_1.JPG

if(!PyArg_ParseTuple(args, “ii”, &num, &num2)) return NULL; "Ii" est un état où il y a deux arguments de type int en langage c.

・ À propos de la valeur de retour La valeur de retour peut être retournée par return.

● Rendre le module utilisable ailleurs (déplacer le dossier) $ sudo mv intPrint.cpython-34m.so /usr/local/lib/python3.4/dist-packages/ intPrint.cpython-34m.so

● Implémentation dans le même fichier Vous pouvez. Je ne l'ai pas fait.

● Implémentation en classe Vous pouvez. Je ne l'ai pas fait.

en conclusion

Lorsque j'examinais moi-même le module wrapper, je ne pouvais pas le trouver créé dans un fichier séparé, donc je le poste. En premier lieu, je pense qu'il est rare de créer un fichier séparé avec python.h (rires)

Enfin, merci d'avoir lu jusqu'ici. J'espère que cela aide encore un peu quelqu'un.

Recommended Posts

Appeler le langage C depuis Python (python.h)
Appeler C depuis Python avec DragonFFI
Appeler popcount depuis Ruby / Python / C #
Appeler C / C ++ depuis Python sur Mac
Appeler des fonctions du langage C depuis Python pour échanger des tableaux multidimensionnels
Générer un langage C à partir d'une expression S avec Python
Appelez votre propre bibliothèque partagée en langage C à partir de Python à l'aide de ctypes
Appel de scripts Python à partir de Python intégré en C ++ / C ++
Langage C pour voir et se souvenir de la partie 1 Appeler le langage C depuis Python (bonjour le monde)
Langage C pour voir et se souvenir de la partie 4 Appelez le langage C depuis Python (argument) double
Langage C pour voir et se souvenir de la partie 5 Appel du langage C à partir du tableau Python (argument)
Appeler CPLEX depuis Python (DO cplex)
[Python] Comment appeler une fonction de c depuis python (édition ctypes)
Langage C pour voir et se souvenir de la partie 3 Appelez le langage C depuis Python (argument) c = a + b
Appelez Matlab depuis Python pour optimiser
Introduction à Protobuf-c (langage C ⇔ Python)
Conseils pour appeler Python à partir de C
Exécuter du code Python à partir de l'interface graphique C #
Exécutez des scripts Python de manière synchrone à partir de C #
Appelez python de nim avec Nimpy
Aller au langage pour voir et se souvenir de la partie 8 Appeler le langage GO à partir de Python
4 langage de comparaison de fermeture (Python, JavaScript, Java, C ++)
Utilisation des fonctions C ++ de python avec pybind11
Appeler des commandes depuis Python (édition Windows)
sql à sql
notes de python C ++
python, openFrameworks (c ++)
MeCab de Python
Créer un tableau C à partir d'une feuille Python> Excel
Écriture de journaux dans un fichier CSV (Python, langage C)
Envelopper C avec Cython pour une utilisation à partir de Python
Appelez la bibliothèque Python pour la normalisation de texte depuis MATLAB
Envelopper C ++ avec Cython pour une utilisation à partir de Python
Je veux créer du code C ++ à partir de code Python!
Appeler Polly à partir du kit SDK AWS pour Python
Un moyen simple d'appeler Java depuis Python
Touchez MySQL depuis Python 3
Exploitez Filemaker depuis Python
Essayez de créer un module Python en langage C
Python: traitement du langage naturel
Pointeur de modèle d'extension Python C / C ++
Accéder à bitcoind depuis python
Changements de Python 3.0 à Python 3.5
Changements de Python 2 à Python 3.0
Python depuis ou import
Appelons votre propre bibliothèque C ++ avec Python (Préférences)
File d'attente ALDS1_3_B langage C
Utilisez MySQL depuis Python
Exécutez Python à partir d'Excel
Introduction au langage Python
Exécuter des commandes depuis Python
Points Python du point de vue d'un programmeur en langage C
Next Python en langage C
Utiliser MySQL depuis Python
Faire fonctionner LXC depuis Python
Manipuler riak depuis python
Forcer Python depuis Fortran
Appelez votre propre module python à partir du package ROS
Utilisez BigQuery depuis Python.
[Algorithme de langage C] Endianness