return tuple from C to python (extending python)

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

    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

      • Chetan

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

        "Kiran" <Kiran.Karra@gm ail.comwrites:
        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.
        >
        You could use PyInt_FromXXXX functions to convert dat[i] to PyInt

        Comment

        • Andrew Poelstra

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

          On Tue, 2006-10-24 at 15:24 -0700, Kiran wrote:
          Hi all, I want to make python call some C functions, process them and
          return them.
          Try comp.lang.pytho n
          --
          Andrew Poelstra <http://www.wpsoftware. net/projects/>

          Comment

          • Kiran

            #6
            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...