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.
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.
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.
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)
・ 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.)
○ 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
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.
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