如何让 Python 代码与 C++ App 一起工作?
Posted
技术标签:
【中文标题】如何让 Python 代码与 C++ App 一起工作?【英文标题】:How to get Python code to work with C++ App? 【发布时间】:2009-12-30 07:49:47 【问题描述】:我有以下 python 3 文件:
import base64
import xxx
str = xxx.GetString()
str2 = base64.b64encode(str.encode())
str3 = str2.decode()
print str3
xxx 是一些 C++ 代码导出的模块。此脚本不起作用,因为在此脚本上调用 Py_InitModule 返回 NULL。奇怪的是如果我在同一目录中创建一个存根 xxx.py
def GetString() :
return "test"
并在 python.exe 下运行原始脚本,它可以工作并输出 base64 字符串。我的问题是为什么不喜欢xxx.GetString的返回值?在 C++ 代码中,它返回一个字符串对象。我希望我已经很好地解释了我的问题......这是一个奇怪的错误。
【问题讨论】:
除非您发布您的 C++ 代码,否则无法回答此问题。错误就在那里。你的 Python 代码没有问题。 @George:请添加标签名称“C++”...另外,请发布您的 C++ 代码... 修复了标签。我会尽快添加代码。 另外,我还有另一个使用 re 模块的脚本,它适用于我的代码......但这不是。 Unicode 和它有什么关系吗? 呃,你似乎已经补充说你正在使用 Python 3。是真的吗?如果是,您应该首先尝试使用 Python 3 执行脚本(您会看到由于各种问题而失败,您必须在继续之前修复这些问题)。确实,它证明了提供有关您的问题的详细信息是多么重要;否则我们只是在浪费时间。 【参考方案1】:我知道每个人都这么说...但是: Boost 有一个很棒的库,用于向 python 公开类并来回获取数据。如果您遇到问题,并且寻找替代方案是一种选择,我强烈推荐 C 接口的 boost python 库。我两个都用过,boost赢了。
【讨论】:
【参考方案2】:Py_InitModule() 用于初始化 用 C 编写的扩展模块,这不是您在此处寻找的。如果你想从 C 中导入模块,C API 中有很多可用的函数:http://docs.python.org/c-api/import.html
但如果您的目标确实是运行脚本而不是导入模块,您也可以使用此处描述的 PyRun_XXX() 函数之一:http://docs.python.org/c-api/veryhigh.html
【讨论】:
后者是我想要的,但它仍然没有运行......我想知道它是否与 GetString 返回一个 ASCII 字符串而不是 Unicode 有关。 这里是:return Py_BuildValue("s","test"); 这仍然没有多大意义!请发布使用 Py_BuildValue() 的结果的代码。不要以为提供一些关于您正在尝试做的事情的部分和省略的信息就足以让我们准确诊断您的问题!【参考方案3】:呃...您必须调查 Py_InitModule 为什么返回 NULL。使用该模块发布 Python 代码无济于事。
【讨论】:
我不知道为什么它返回 NULL - 没有任何东西打印到控制台。等一下。我明白你在说什么。当我尝试使用 Py_InitModule 加载上面的脚本时返回 NULL,而不是其他模块。以上是关于如何让 Python 代码与 C++ App 一起工作?的主要内容,如果未能解决你的问题,请参考以下文章
Python 打字:如何让 Type[C] 与 TypeVars 和泛型一起工作?
如何编译多个 C++ 文件以将它们与 Python ctypes 一起使用?