【问题标题】:c++ python 3 bindingc++ python 3绑定
【发布时间】:2013-08-17 09:15:57
【问题描述】:

我正在尝试在 C++ 中绑定 python3。

使用时:

Py_SetProgramName(argv[0]);

它给出了这个错误:

error C2664: 'Py_SetProgramName' : cannot convert parameter 1 from 'char *' to 'wchar_t *'

尽管documentation example 就是这样做的。

我也试过这个:

Py_SetProgramName((wchar_t*)argv[0]);

但显然这是 wrong way 来做的。

那么我该如何解决这个问题,在 C++ 中绑定 Python 3 还有其他好的资源吗?

【问题讨论】:

    标签: c++ python


    【解决方案1】:

    尝试以下操作:

    wchar_t progname[FILENAME_MAX + 1];
    mbstowcs(progname, argv[0], strlen(argv[0]) + 1);
    Py_SetProgramName(progname);
    

    http://www.cplusplus.com/reference/cstdlib/mbstowcs/

    【讨论】:

    • MAXPATHLEN 未定义,我将其硬编码为 255,这样我就可以编译了。它似乎可以工作,尽管就像我的“错误”解决方案一样,我还没有办法对其进行测试。 +1
    • 如果您使用的是 Unix,请插入 #include <sys/param.h>
    • @Brae,我在 Windows 中找不到 MAXPATHLEN 等效项。使用#define MAXPATHLEN 1024
    • @Brae,我用FILENAME_MAX 替换了MAXPATHLEN。它不需要标题。 (未在 Windows 中测试)。
    • 被警告 mbstowcs 是某些平台的真正麻烦源。一个随机的例子是 android api 19。Python3.7+ 现在已经集成了官方解决方法和 unicode coercion 参见 PEP 538/540。
    【解决方案2】:

    我建议你看at this question

    Python 3 API 的示例文档似乎尚未从 Python 2 升级 - 您展示的示例就是其中之一(我已经报告了其他一些)。

    我在这方面没有找到好的文档。即使是著名的 Python 书籍的新版(Python 3),要么很少涉及这个主题,要么存在代码错误(通常是因为代码来自 Py2)。

    【讨论】:

    • 这很痛苦,感谢链接,它看起来与 falsetru 的答案非常相似。
    【解决方案3】:

    现在官方将char转换为wchar_t的方式是:

    wchar_t *program = Py_DecodeLocale(argv[0], NULL);
    Py_SetProgramName(program);
    

    附带说明 mbstowcs 在某些平台上不可靠。

    在 c++ 中使用 python2/3 的一个很好的例子是 Panda3D。一个用 python 编写的 c++ 游戏引擎,它还提供了一个 c++ 模块构建器。

    【讨论】:

    • 对不起,但我没有看到任何关于“在 C++ 中绑定 Python 3 的其他好的资源”的答案,纠正错误,如 mbstowcs 使用 4 个月大(python3.7+)和恕我直言对新人很重要。在 C++ 中嵌入 python 也没有得到很好的支持,所以问题没有年龄。
    • 不是说你不能添加它,我觉得它太老了很有趣
    猜你喜欢
    • 2014-02-20
    • 2013-01-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-01-01
    • 2014-09-10
    • 1970-01-01
    • 2020-04-24
    相关资源
    最近更新 更多