Frage

Ich habe eine C -Python -Erweiterung und möchte einige Diagnose ausdrucken.

Ich erhalte eine Zeichenfolge als Pyobject*.

Wie ist der kanonische Weg, um einen String -Repräsentant dieses Objekts zu erhalten, so dass es als const char *verwendet werden kann?

aktualisieren: geklärt, um den Zugang als const char *zu betonen.

War es hilfreich?

Lösung

Verwenden PyObject_Repr (Python nachzuahmen repr Funktion) oder PyObject_Str (zu imitieren str) und dann anrufen PyString_AsString bekommen char * (Sie können und sollten es normalerweise verwenden als const char*, zum Beispiel:

PyObject* objectsRepresentation = PyObject_Repr(yourObject);
const char* s = PyString_AsString(objectsRepresentation);

Diese Methode ist für jeden in Ordnung PyObject. Wenn Sie absolut sicher sind yourObject ist eine Python -Zeichenfolge und nicht etwas anderes, wie zum Beispiel eine Nummer, Sie können die erste Zeile überspringen und einfach nur tun:

const char* s = PyString_AsString(yourObject);

Andere Tipps

Hier ist die richtige Antwort, wenn Sie Python 3 verwenden:

static void reprint(PyObject *obj) {
    PyObject* repr = PyObject_Repr(obj);
    PyObject* str = PyUnicode_AsEncodedString(repr, "utf-8", "~E~");
    const char *bytes = PyBytes_AS_STRING(str);

    printf("REPR: %s\n", bytes);

    Py_XDECREF(repr);
    Py_XDECREF(str);
}

Versuchen PyObject_Repr (Python nachzuahmen repr) oder PyObject_Str (Python nachzuahmen str).

Dokumente:

Berechnen Sie eine String -Darstellung von Objekt o. Gibt die String -Darstellung des Erfolgs zurück, null zum Scheitern. Dies ist das Äquivalent der Python -Expression Repr (o). Aufgerufen von der integrierten Funktion repr ().

Wenn Sie das Objekt einfach in Python 3 ausdrucken müssen, können Sie eine dieser Funktionen verwenden:

static void print_str(PyObject *o)
{
    PyObject_Print(o, stdout, Py_PRINT_RAW);
}

static void print_repr(PyObject *o)
{
    PyObject_Print(o, stdout, 0);
}
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top