简体   繁体   中英

How to get a char* from a PyObject which points to a string

How can I get a char* from a PyObject which points to a string. For example, this is the python script,

Test.Connect("272.22.20.65", 1234)

and this is the C++ code,

static PyObject* Connect(PyObject *self, PyObject *args)
{
    PyObject* pIP;
    PyObject* pPort;

    if (!PyArg_UnpackTuple(args, "Connect", 2, 2, &pIP, &pPort)) 
    {
        return NULL;
    }

    const char* zIP = GetAsString(pIP);
    long iPort      = PyLong_AsLong(pPort);

I want to get that IP address as a char* (GetAsString is a dummy function :D ). Please note that I'm using Python 3.1.

PS I don't think this question got the correct answer , since there is no PyStringObject or PyString_AsString in Python 3. Isn't it ?

First you encode it , then you retrieve it . Don't forget to decref the temporary.

Here is my portable recipe for it, which makes use the default encoding, where that is applicable. It assumes you start with a PyObject* , named o . If you still have your input tuple from the function call, you can skip the first 2 lines.

PyObject* args = Py_BuildValue("(O)", o);
/* Py_DECREF(o); if o is not borrowed */
if (!args) return 0;
const char* s = 0;
if (!PyArg_ParseTuple(args, "s", &s)) {
  Py_DECREF(args);
  return 0;
}

/* s now points to a const char* - use it, delete args when done */

Py_DECREF(args);

PS: I have not tested it, but it should work with older versions of Python as well. There is nothing on it which is version specific.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM