【问题标题】:Only one character returned from PyUnicode_AsWideCharStringPyUnicode_AsWideCharString 只返回一个字符
【发布时间】:2015-03-24 23:13:39
【问题描述】:

我试图在 Visual Studio 2012 C++ 程序中使用 Python 的 C API 获取在嵌入式 Python 环境中定义的字符串变量的值。

作为嵌入式环境,我使用的是 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! 的第一个字符?

【问题讨论】:

    标签: python c++ python-c-api


    【解决方案1】:

    %s 格式说明符表示窄字符串 (char*)。你想要%ls,它表示一个宽字符串(wchar_t*):

    printf("Value of my_var in C: %ls", result);
    

    你也应该更喜欢wprintf;正如你在这里所做的那样,混合窄和宽字符串不是一个好主意。

    【讨论】:

    • 操作!谢谢,我真的是看错地方了。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-06-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多