PyArg_Parse vs PyArg_ParseTuple
ignacio at openservices.net
Wed Oct 17 03:42:04 CEST 2001
On Wed, 17 Oct 2001, David Brady wrote:
> I'm new to Python, and I've searched the archives for more info but can't
> seem to find the info I need. I am having trouble using PyArg_ParseTuple().
> Here is the python code I'm embedding:
> # TestModule.py
> def NumberFunction(x):
> return x+1
> As you see, it's not too complex. :-) This is just a proof of concept I'm
> working on to prove it can be done.
> Here is the code I'm trying to embed it in. Note: this is C++, does that
> make a difference in this case?
> // TestEmbed.cpp
> #include <stdio.h>
> #include <Python.h>
> void main(void)
> long val = 7;
> PyObject *pmod, *pfunc, *pargs, *pstr;
> printf( "Processing data: %ld\n", val );
> pmod = PyImport_ImportModule( "TestModule" );
> pfunc = PyObject_GetAttrString( pmod, "NumberFunction" );
> pargs = Py_BuildValue( "(l)", val );
> pstr = PyEval_CallObject( pfunc, pargs );
> // *** This code works ***
> PyArg_Parse( pstr, "l", &val );
> // *** This code does NOT work ***
> //PyArg_ParseTuple( pstr, "l", &val );
> printf( "Val returned was %d\n", val );
> If I use the ParseTuple version, the code appears to run fine, but val is
> unchanged. I've tried using "(l)" as the string but I'm grasping at straws
> I read in the documentatian that PyArg_Parse() is deprecated, so I would
> like to get this working correctly.
You're misunderstanding what PyArg_Parse() and PyArg_ParseTuple() are used
for. They are used for when a C function is called by a Python program, not
the other way around. In your case you should probably be using one of the
PyInt_As*() or PyLong_As*() functions.
Also, a C signed long on a 32-bit machine translates into a Python Integer, so
you can just as easily use "(i)" in Py_BuildValue().
Ignacio Vazquez-Abrams <ignacio at openservices.net>
"As far as I can tell / It doesn't matter who you are /
If you can believe there's something worth fighting for."
- "Parade", Garbage
More information about the Python-list