Как получить строку символа из PyObject str?

#python #c #c

#python #c #c

Вопрос:

Привет, я изучаю, как использовать python на c , и мне интересно, как преобразовать возвращаемое значение python во что-то, что я могу использовать на c .

Вот мой код:

 
    CPyInstance pyInstance;
    PyRun_SimpleString("import sys");
    PyRun_SimpleString("sys.path.append(".")");
    CPyObject pName = PyUnicode_FromString("Info");
    CPyObject pModule = PyImport_Import(pName);

    if (pModule)
    {
        CPyObject pFunc = PyObject_GetAttrString(pModule, "getTracks");

        if (pFunc amp;amp; PyCallable_Check(pFunc))
        {
            CPyObject pValue = PyObject_CallObject(pFunc, NULL);
            //print the returned string
        }
        else { std::cout << "Error: function getTracks()n"; }
    }
    else { std::cout << "error: no module imported"; }

    return 0;
 
 def getTracks():
    
    returnString = ""

    for track in results['tracks'][:10]:
        returnString  = 'track    : '   track['name']
      
    return returnString
 

Ответ №1:

Вы можете использовать функции из раздела UTF-8 Codecs .

Например, PyUnicode_AsUTF8AndSize:

 CPyObject pValue = PyObject_CallObject(pFunc, NULL);
Py_ssize_t size;
const char* data = PyUnicode_AsUTF8AndSize(pValue.getObject(), amp;size);
std::cout << std::string(data, size) << std::endl;
 

Или PyUnicode_AsUTF8

 const char* data = PyUnicode_AsUTF8(pValue.getObject());
std::cout << data << std::endl;
 

const char* PyUnicode_AsUTF8AndSize(PyObject *unicode, Py_ssize_t *size)

Возвращает указатель на UTF-8 кодировку Unicode object и сохраняет размер закодированного представления (в байтах) size . size Аргумент может быть NULL ; в этом случае размер не будет сохранен. К возвращаемому буферу всегда добавляется дополнительный нулевой байт (не входит в размер), независимо от того, есть ли какие-либо другие нулевые кодовые точки.

Это кэширует представление строки в формате UTF-8 в Юникоде object , и последующие вызовы будут возвращать указатель на тот же буфер. Вызывающий объект не несет ответственности за освобождение буфера.

[…]

const char* PyUnicode_AsUTF8(PyObject *unicode)

Как PyUnicode_AsUTF8AndSize() , но не сохраняет размер.