return tuple from C to python (extending python)

Collapse
This topic is closed.
X
X
 
  • Time
  • Show
Clear All
new posts
  • Kiran

    #1

    return tuple from C to python (extending python)

    Hi all, I want to make python call some C functions, process them and
    return them.

    Ok, I got all the wrapper functions and everything setup right. Here
    is my problem. What I need to do is to return a tuple from C to
    python.

    To go about doing this, I first create a tuple object in C doing the
    following:

    PyObject* toRet;
    toRet = PyTuple_New(num _addr);

    then, in a for loop, i assign values to the tuple as follows:

    for ( i = 0; i < num_addr; i++ )
    {
    printf("%d\n", dat[i]);
    PyTuple_SET_ITE M(toRet, i, (PyObject*)dat[i] );
    }
    (dat is declared as follows: unsigned int* dat; )

    then, i say return toRet at the end of my C function.

    when I try to print the tuple in python, it says the memory address
    0x.... could not be written, and I can see a part of the tuple
    printout, which is as follows:
    ( <nil>,
    then i get my error.

    can someone please help me with this?

    thanks a lot!
    -- Kiran

  • Simon Forman

    #2
    Re: return tuple from C to python (extending python)

    Kiran wrote:
    Hi all, I want to make python call some C functions, process them and
    return them.
    >
    Ok, I got all the wrapper functions and everything setup right. Here
    is my problem. What I need to do is to return a tuple from C to
    python.
    >
    To go about doing this, I first create a tuple object in C doing the
    following:
    >
    PyObject* toRet;
    toRet = PyTuple_New(num _addr);
    >
    then, in a for loop, i assign values to the tuple as follows:
    >
    for ( i = 0; i < num_addr; i++ )
    {
    printf("%d\n", dat[i]);
    PyTuple_SET_ITE M(toRet, i, (PyObject*)dat[i] );
    }
    (dat is declared as follows: unsigned int* dat; )
    >
    then, i say return toRet at the end of my C function.
    >
    when I try to print the tuple in python, it says the memory address
    0x.... could not be written, and I can see a part of the tuple
    printout, which is as follows:
    ( <nil>,
    then i get my error.
    >
    can someone please help me with this?
    >
    thanks a lot!
    -- Kiran
    I have not done a great deal of extension work with python, however, I
    do not believe you can simply cast an int (or pointer to int, which is
    what you say dat is declared as, unless my C is /really/ rusty) to
    PyObject*.

    I think you need to do something like Py_BuildValue(" i", 123), but see
    http://docs.python.org/ext/buildValue.html for more info.

    Peace,
    ~Simon

    Comment

    • Farshid Lashkari

      #3
      Re: return tuple from C to python (extending python)

      Simon Forman wrote:
      I have not done a great deal of extension work with python, however, I
      do not believe you can simply cast an int (or pointer to int, which is
      what you say dat is declared as, unless my C is /really/ rusty) to
      PyObject*.
      >
      I think you need to do something like Py_BuildValue(" i", 123), but see
      http://docs.python.org/ext/buildValue.html for more info.
      Simon is correct. You need to create a python object from your unsigned
      int. Try the following instead:

      PyTuple_SET_ITE M(toRet, i, PyInt_FromLong( dat[i]) );

      -Farshid

      Comment

      • Kiran

        #4
        Re: return tuple from C to python (extending python)


        Farshid Lashkari wrote:
        Simon Forman wrote:
        I have not done a great deal of extension work with python, however, I
        do not believe you can simply cast an int (or pointer to int, which is
        what you say dat is declared as, unless my C is /really/ rusty) to
        PyObject*.

        I think you need to do something like Py_BuildValue(" i", 123), but see
        http://docs.python.org/ext/buildValue.html for more info.
        >
        Simon is correct. You need to create a python object from your unsigned
        int. Try the following instead:
        >
        PyTuple_SET_ITE M(toRet, i, PyInt_FromLong( dat[i]) );
        >
        -Farshid
        That did the trick. thanks guys both for your help!

        Comment

        Working...