Absolultely confused...
Daniel Dittmar
daniel.dittmar at sap.corp
Thu Oct 6 10:48:28 EDT 2005
Jeremy Moles wrote:
> So, here is my relevant code:
>
> PyArg_ParseTuple(args, "O!", &PyType_vector3d, &arg1)
>
> And here ismy error message:
>
> argument 1 must be pylf.core.vector3d, not pylf.core.vector3d
>
It looks as if two PyType_vector3d exist in your system
- the one that created the object passed to your routine
- the one in your extension code
As PyType_vector3d probably comes from a shared object/DLL
- does your code accesses really the same shared object that is also
loaded by the Python interpreter? It could be that you linked with a
specific file, but Python loads something different from $PYTHONPATH
- on Windows, you couldn't simply import a variable from a DLL, you had
to call a special routine to get the pointer
One possible portable solution: in your module initialization
- import pylf.core
- create an object of type vector3d
- use your knowledge about the inner structure of Python objects and get
the pointer to the PyType from the object
- store it in a module static variable TypeVector3D
- pass that variable to PyArg_ParseTuple
Browse the Python Extension API, maybe partts or all of this are already
available.
There's still a problem left when pylf.core gets reloaded (rare, but
possible). I assume the shared object also gets reloaded, which means
that the type objects gets loaded to a new address and PyArg_ParseTuple
will complain again. I'm not sure if there is a solution to this,
because there still could be objects create from the old module.
Maybe you should just check the type yourself by comparing the class
names buried in the PyType. You could cache one or two type pointers to
speed this up.
Daniel
More information about the Python-list
mailing list