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