Pourquoi cette fonction externe "c" ne fonctionne-t-elle pas à l'aide de Python CTYPES?
-
14-11-2019 - |
Question
J'ai la fonction C ++ suivante qui définit un entier à l'aide d'une chaîne.
#include <sstream>
#include <string>
#include <iostream>
using namespace std;
extern "C" {
int a() {
int number;
string value("100");
std::istringstream strm(value);
strm >> number;
if (strm.fail()) {
cout << "Ouch!" << endl;
}
else {
cout << "Number set to:" << number << endl;
};
return (int)strm.bad();
}
}
int main(int argc, char **argv)
{
a();
}
Si je compile cela en tant que programme, cela fonctionne.
$ g++ ./streamtest.cc -o streamtest;./streamtest
Number set to:100
Mais si j'appelle la même fonction de CTYPES, il ne définit pas l'entier et le "STRM" est laissé dans un "mauvais" état.
$ g++ -shared streamtest.cc -o libstreamtest.so
$ python -c "import ctypes;a = ctypes.CDLL('libstreamtest.so').a();print 'Got [%s] from a()' %a"
Ouch!
Got [1] from a()
Cela m'a été perplexe.Comment puis-je faire fonctionner cette fonction sous CTTPES?
La solution
Cela fonctionne pour moi sur Windows 7 (X64) en utilisant X86 Build.Avez-vous essayé d'envelopper le code avec C pour une utilisation en tant que module avec Python?Peut-être que cela fonctionne pour vous ..
C:\Users\niklas\Desktop>g++ -o streamtest.pyd -shared -I"C:\Python27\include" -L"C:\Python27\libs" streamtestmodule.cpp -lpython27
C:\Users\niklas\Desktop>python
Python 2.7.2 (default, Jun 12 2011, 15:08:59) [MSC v.1500 32 bit (Intel)] on win32
Type "help", "copyright", "credits" or "license" for more information.
>>> import streamtest
>>> streamtest.a()
Number set to:100
0
#include <Python.h>
#include "streamtest.cpp"
extern "C" {
static PyObject* streamtest_a(PyObject* self) {
PyObject* re = Py_BuildValue("i", a());
return re;
}
static PyMethodDef StreamtestMethods[] = {
{"a", (PyCFunction) streamtest_a, METH_NOARGS, NULL},
{NULL, NULL, 0, NULL}
};
void initstreamtest(void) {
PyObject* module = Py_InitModule("streamtest", StreamtestMethods);
if (module == NULL) {
cout << "Module initialization failed.";
}
}
} // extern "C"
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow