J'ai essayé de rendre un programme écrit en C utilisable depuis Python 3 Toutes les références sont anciennes et j'ai eu du mal à le rendre compatible avec Python3 ...
hello.c
int add(int x, int y)
{
return x + y;
}
void out(const char* adrs, const char* name)
{
printf("Bonjour, je%de s%s.\n", adrs, name);
}
C'est le code source C, qui a deux fonctions, ajouter et sortir.
helloWrapper.c
#include "Python.h"
extern int add(int, int);
extern void out(const char*, const char*);
PyObject* hello_add(PyObject* self, PyObject* args)
{
int x, y, g;
if (!PyArg_ParseTuple(args, "ii", &x, &y))
return NULL;
g = add(x, y);
return Py_BuildValue("i", g);
}
PyObject* hello_out(PyObject* self, PyObject* args, PyObject* kw)
{
const char* adrs = NULL;
const char* name = NULL;
static char* argnames[] = {"adrs", "name", NULL};
if (!PyArg_ParseTupleAndKeywords(args, kw, "|ss",
argnames, &adrs, &name))
return NULL;
out(adrs, name);
return Py_BuildValue("");
}
static PyMethodDef hellomethods[] = {
{"add", hello_add, METH_VARARGS},
{"out", hello_out, METH_VARARGS | METH_KEYWORDS},
{NULL}
};
static struct PyModuleDef hellomodule =
{
PyModuleDef_HEAD_INIT,
"hellomodule", /* name of module */
"", /* module documentation, may be NULL */
-1, /* size of per-interpreter state of the module, or -1 if the module keeps state in global variables. */
hellomethods
};
PyMODINIT_FUNC PyInit_hellomodule(void)
{
return PyModule_Create(&hellomodule);
}
Ceci est le code source principal.
Voir ici pour la signification de chaque programme → Appeler un programme C depuis Python
Exécutez trois commandes.
gcc -fpic -o hello.o -c hello.c
gcc -fpic -I`python3-config --prefix`/Headers -o helloWrapper.o -c helloWrapper.c
gcc -L`python3-config --prefix`/lib -lpython3.5 -shared hello.o helloWrapper.o -o hellomodule.so
python3-config - prefix
et compilez helloWrapper.c.python3-config - prefix
avec -L pour créer la bibliothèque.Essayons-le, est-ce vraiment fait?
hnkz $ python3
Python 3.5.2 (v3.5.2:4def2a2901a5, Jun 26 2016, 10:47:25)
[GCC 4.2.1 (Apple Inc. build 5666) (dot 3)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> import hellomodule
>>> hellomodule.add(2,3)
5
>>> hellomodule.out("hamamatsu","hnkz")
Bonjour, je suis hnkz de hamamatsu.
C'est fait! Hou la la! !!
Je veux l'appliquer et créer un enregistreur de frappe avec Python3.
Appeler un programme C depuis Python J'ai essayé la liaison C en Python Compiler can't find Py_InitModule() .. is it deprecated and if so what should I use?
Recommended Posts