Как получить char* из PyObject, который указывает на строку

Как я могу получить char* из PyObject, который указывает на строку. Например, это скрипт на питоне,

Test.Connect("272.22.20.65", 1234)

а это код С++,

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);

Я хочу получить этот IP-адрес в виде char* (GetAsString — это фиктивная функция: D). Обратите внимание, что я использую Python 3.1.

P.S. Я не думаю, что на этот вопрос получил правильный ответ, поскольку нет PyStringObject или PyString_AsString в Python 3. Не так ли?


person Morpheus    schedule 27.03.2012    source источник
comment
@Свен Марнах. это ул. Но нет способа получить char* из PyUnicode_*. Я ошибаюсь ?   -  person Morpheus    schedule 27.03.2012
comment
лол... где Свен Марнах? Когда я тебе ответил, твоего комментария не было   -  person Morpheus    schedule 27.03.2012


Ответы (2)


Сначала вы кодируете его, а затем извлеките его. Не забудьте удалить временные файлы.

person Ignacio Vazquez-Abrams    schedule 27.03.2012
comment
Спасибо за ответ, но он не работает. PyBytes_AsString возвращает значение NULL. (упрощенно так я его использовал, PyBytes_AsString(PyUnicode_AsUTF8String(pObject)) - person Morpheus; 27.03.2012
comment
@Свен Марнах. Спасибо за точку. Я путаюсь с python3, с python2x все просто, не так ли. - person Morpheus; 27.03.2012
comment
Такой вызов двух функций вместе приведет к утечке памяти. - person Ignacio Vazquez-Abrams; 27.03.2012
comment
Я упростил для комментирования, вот так. PyObject* pStrObj = PyUnicode_AsUTF8String(pObject); char* zStr = PyBytes_AsString(pStrObj); char* zStrDup = strdup(zStr); Py_DECREF(pStrObj); Надеюсь, я сделал это правильно. - person Morpheus; 27.03.2012

Вот мой портативный рецепт для него, который позволяет использовать кодировку по умолчанию, где это применимо. Предполагается, что вы начинаете с PyObject* с именем o. Если у вас все еще есть входной кортеж из вызова функции, вы можете пропустить первые 2 строки.

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: я не тестировал его, но он должен работать и со старыми версиями Python. На нем нет ничего, что зависит от версии.

person André Anjos    schedule 31.03.2014