Basic python extension producing error: "dynamic module not initialized properly"
Jason Veldicott
jasonveldicott at gmail.com
Fri Aug 31 12:44:26 EDT 2012
Hi,
I am trying to create an extension to call into a c++ library, a library
which simply returns a string, given a string. At first, a quick and
simple approach was tried (based on post
http://stackoverflow.com/questions/1615813/how-to-use-c-classes-with-ctypes)
in which the usual infrastructure for loading extensions is bypassed. A
working simple example is shown beneath:
myextension.cpp
#include <python.h>
extern "C"
{
int test_func() {
return 10;
}
}
To execute in Python:
from ctypes import cdll
mlib=cdll.LoadLibrary("myextension.dll")
print( mlib.test_func() )
This works fine when function return type is a number, but not when a
string. C++ code returns char *, which is received by Python as a pointer,
which prints as a number, eg1755066468. Apparently, based on web posts
viewed, it seems data conversion is required, using a function such
as Py_BuildValue("s", str) from python.h. But this gave a similar result,
in which a pointer is received by Python instead of a string. The modified
function used in this case:
PyObject * test_func() {
return Py_BuildValue("s", "aString");
}
Resort was then made to the conventional approach of defining a method
table and initializing method. (Abandoned cdll.LoadLibrary(...) as
subsequently test_func was not recognised, and instead put the dll (.dll
changed to pyd) in /python26/DLLs.) The revised code:
myextension.cpp
#include <python.h>
extern "C"
{
static PyObject * test_func(PyObject *self, PyObject *args)
{
return (PyObject *) 0;
}
static PyMethodDef TestMethods[] = {
{"test", test_func, METH_VARARGS, "test"},
{NULL, NULL, 0, NULL}
};
PyMODINIT_FUNC initlibTestExtnModule(void) {
(void) Py_InitModule("TestExtnModule", TestMethods);
}
}
Using the import statement "import libTestExtnModule" however produced the
following error message:
"SystemError: dynamic module not initialized properly"
As far as I know there is nothing wrong with the initialisation of the
extension code above. Perhaps the error is related to compilation. I
have not used distutils, but rather compiled externally and dropped the dll
(as pyd) into the /DLLs directory as mentioned. This should work, as far
as I know. Related to compilation, both MinGW and Python2.6 are 32 bit
versions, and g++ statements used were:
mingw32-g++ "-IC:\\Python26\\include" -O0 -g3 -Wall -c -fmessage-length=0
-o myextension.o "..\\myextension.cpp"
mingw32-g++ -LC:/Python26/libs -shared -o
libTestExtnModule.pyd myextension.o -lpython26
Any suggestions as to why the dynamic module is not initialising properly,
or as to how otherwise a string can be returned, would be greatly
appreciated.
Thanks
Jason
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://mail.python.org/pipermail/python-list/attachments/20120831/451033ae/attachment.html>
More information about the Python-list
mailing list