PyUnicode_AsWideCharString 只返回一个字符
Only one character returned from PyUnicode_AsWideCharString
我试图在 Visual Studio 2012 C++ 程序中获取在嵌入式 Python 环境中使用 Python 的 C [=31= 定义的字符串变量的值].
作为嵌入式环境,我使用 Python 3.4.3 64 位,我从 https://www.python.org/downloads/
下载
这是我在 Visual Studio 2012 中使用的代码(目标:Release,x64):
#include <Python.h>
int _tmain(int argc, _TCHAR* argv[])
{
Py_Initialize();
PyObject *main = PyImport_AddModule("__main__");
PyObject *globals = PyModule_GetDict(main);
PyRun_SimpleString("my_var = 'Hello, World!'; print('Value of my_var in Python: ' + my_var)");
PyObject* value = PyDict_GetItemString(globals, "my_var");
wchar_t* fetched_value = PyUnicode_AsWideCharString(value, NULL);
Py_DECREF(value);
wchar_t result[20];
wcscpy_s(result, 19, fetched_value);
PyMem_Free(fetched_value);
printf("Value of my_var in C: %s", result);
Py_Finalize();
return 0;
}
当我 运行 这段代码时,我得到这个输出:
Value of my_var in Python: Hello, World!
Value of my_var in C: H
为什么我在调用 PyUnicode_AsWideCharString(value, NULL);
时只得到 Hello, World!
的第一个字符?
%s
格式说明符表示一个窄字符串 (char*
)。你想要 %ls
,它表示一个宽字符串 (wchar_t*
):
printf("Value of my_var in C: %ls", result);
你也应该更喜欢wprintf
;混合使用窄字符串和宽字符串并不是一个好主意,就像您在此处所做的那样。
我试图在 Visual Studio 2012 C++ 程序中获取在嵌入式 Python 环境中使用 Python 的 C [=31= 定义的字符串变量的值].
作为嵌入式环境,我使用 Python 3.4.3 64 位,我从 https://www.python.org/downloads/
下载这是我在 Visual Studio 2012 中使用的代码(目标:Release,x64):
#include <Python.h>
int _tmain(int argc, _TCHAR* argv[])
{
Py_Initialize();
PyObject *main = PyImport_AddModule("__main__");
PyObject *globals = PyModule_GetDict(main);
PyRun_SimpleString("my_var = 'Hello, World!'; print('Value of my_var in Python: ' + my_var)");
PyObject* value = PyDict_GetItemString(globals, "my_var");
wchar_t* fetched_value = PyUnicode_AsWideCharString(value, NULL);
Py_DECREF(value);
wchar_t result[20];
wcscpy_s(result, 19, fetched_value);
PyMem_Free(fetched_value);
printf("Value of my_var in C: %s", result);
Py_Finalize();
return 0;
}
当我 运行 这段代码时,我得到这个输出:
Value of my_var in Python: Hello, World!
Value of my_var in C: H
为什么我在调用 PyUnicode_AsWideCharString(value, NULL);
时只得到 Hello, World!
的第一个字符?
%s
格式说明符表示一个窄字符串 (char*
)。你想要 %ls
,它表示一个宽字符串 (wchar_t*
):
printf("Value of my_var in C: %ls", result);
你也应该更喜欢wprintf
;混合使用窄字符串和宽字符串并不是一个好主意,就像您在此处所做的那样。