Manejo de cadenas Python 3.3 C (wchar_t vs char)

Manejo de cadenas Python 3.3 C (wchar_t vs char)


Estoy tratando de integrar Python 3.3 en nuestro proyecto C++.
Python 3.3 parece haber introducido UTF-8 como almacenamiento preferido, PEP 393:"la especificación elige UTF-8 como la forma recomendada de exponer cadenas al código C ."


Escribí este código de inicialización, que parece ser simple e intuitivo:


#include <Python.h>
#include "log.h"
void python_init(const char *program_name) {
if (not Py_IsInitialized()) {
Py_SetProgramName(program_name);
Py_Initialize();
const char *py_version = Py_GetVersion();
log::msg("initialized python %s", py_version);
}
}

pero la compilación falla:


/home/jj/devel/openage/src/engine/python.cpp:13:3: error: no matching function for call to 'Py_SetProgramName'
Py_SetProgramName(program_name);
^~~~~~~~~~~~~~~~~
/usr/include/python3.3/pythonrun.h:25:18: note: candidate function not viable: no known conversion from 'const char *' to 'wchar_t *' for 1st argument
PyAPI_FUNC(void) Py_SetProgramName(wchar_t *);
^

Así que sí, obviamente necesito un wchar_t * aquí, pero no veo ninguna razón por la cual char * no haría el trabajo aquí.


¿Cuál es la mejor práctica aquí?
Convertir char * a wchar * y lidiar con locales (mbstowcs), lo que también introduciría asignaciones de memoria dinámicas innecesarias?


Además, si Python decidiera optar por wchar completamente, ¿por qué Py_GetVersion() devolver un char * como lo esperaba?


Encontré una pregunta similar para Python <3.3, pero espero que Python 3.3 sea diferente (¿PEP 393?).


El código debe ser compatible con varias plataformas.


=> ¿Cuál es una solución rápida y eficiente para pasar cadenas C (char * ) a Python 3.3?


Respuestas:


En Python 3.5, Py_DecodeLocale se puede usar para hacer la conversión.


https://docs.python.org/3/c-api/sys.html#c.Py_DecodeLocale


Algunas respuestas de código


#include <Python.h>
#include "log.h" void python_init(const char *program_name) {
if (not Py_IsInitialized()) {
Py_SetProgramName(program_name);
Py_Initialize();
const char *py_version = Py_GetVersion();
log::msg("initialized python %s", py_version);
} }
/home/jj/devel/openage/src/engine/python.cpp:13:3: error: no matching function for call to 'Py_SetProgramName'
Py_SetProgramName(program_name);
^~~~~~~~~~~~~~~~~ /usr/include/python3.3/pythonrun.h:25:18: note: candidate function not viable: no known conversion from 'const char *' to 'wchar_t *' for 1st argument PyAPI_FUNC(void) Py_SetProgramName(wchar_t *);
^
// Convert a sequence of strings to an array of WCHAR pointers PYWINTYPES_EXPORT void PyWinObject_FreeWCHARArray(LPWSTR *wchars, DWORD str_cnt);