Ich wickle viel C++ über die Python 2 API (Ich kann aus verschiedenen technischen Gründen nicht Dinge wie swig oder boost.python verwenden). Wenn ich einen String (normalerweise einen Pfad, immer ASCII) nach C/C++ übergeben muss, verwende ich etwas Ähnliches wie das hier:
std::string file_name = PyString_AsString(py_file_name);
if (PyErr_Occurred()) return NULL;
Jetzt überlege ich, auf Python 3 zu aktualisieren, wo die PyString_*
-Methoden nicht existieren. Ich habe eine Lösung gefunden, die besagt, dass ich etwas Ähnliches tun sollte wie das hier:
PyObject* bytes = PyUnicode_AsUTF8String(py_file_name);
std::string file_name = PyBytes_AsString(bytes);
if (PyErr_Occurred()) return NULL;
Py_DECREF(bytes);
Allerdings sind das doppelt so viele Zeilen und es scheint ein wenig hässlich zu sein (und nicht zu vergessen, dass es einen Speicherleck verursachen könnte, wenn ich die letzte Zeile vergesse).
Die andere Option besteht darin, die Python-Funktionen neu zu definieren, um mit bytes
-Objekten zu arbeiten, und sie so aufzurufen:
def some_function(path_name):
_some_function(path_name.encode('utf8'))
Das ist nicht schrecklich, erfordert jedoch einen Python-seitigen Wrapper für jede Funktion.
Gibt es eine sauberere Möglichkeit, damit umzugehen?