PyObject_GetAttrString C++ 函数返回 NULL:无法从 C++ 调用 Python 函数
Posted
技术标签:
【中文标题】PyObject_GetAttrString C++ 函数返回 NULL:无法从 C++ 调用 Python 函数【英文标题】:PyObject_GetAttrString C++ function returning NULL: Unable to call Python functions from C++ 【发布时间】:2014-06-19 18:19:37 【问题描述】:我刚刚开始使用带有 C++ 的 Python,我有点困惑为什么我无法从 C++ 调用 Python 中的函数。
这是我目前在 C++ 中的测试代码:
#include <iostream>
#include <Python.h>
using namespace std;
int main()
Py_Initialize();
PyObject* myModuleString = PyString_FromString("test");
PyObject* myModule = PyImport_Import(myModuleString);
if( myModule )
PyObject* myFunction = PyObject_GetAttrString(myModule, "Hello");
if( myFunction )
PyEval_CallObject( myFunction, NULL );
else
fprintf( stderr, "myFunction is NULL" );
else
fprintf( stderr, "myModule is NULL" );
Py_Finalize();
cin.get();
return 0;
这是我的 test.py Python 代码:
import sys
def Hello():
print "Hello, world!"
之前我有一个更复杂的测试,但是我遇到了 PyObject_GetAttrString 传回 NULL 的问题,所以我想做一个更简单的测试,在调用 PyObject_GetAttrString 后我仍然收到 NULL。根据我的理解,PyObject_GetAttrString 将 PyObject* 传递给函数,然后我调用它,所以在那里接收 NULL 基本上意味着我不能调用函数。
另外,是的,我查看了https://docs.python.org/2.7/,甚至测试了https://docs.python.org/release/2.6.5/extending/embedding.html#pure-embedding 的步骤 5.3 中给出的示例(我使用的是 2.7.7,因为我计划与 3ds Max 集成)。它仍然遇到与 PyObject_GetAttrString 相同的问题。
我假设这是我在 C++ 或 Python 代码中缺少的一个简单错误或步骤。
【问题讨论】:
【参考方案1】:将 Python 脚本名称从 test.py
更改为其他任何对我有用的名称。
【讨论】:
【参考方案2】:我遇到了类似的问题。我发现我传递给 python 的字符串中的空格太远了。据我所知,您的打印语句有 6 个空格而不是 4 个。备份它,看看是否一切都没有清除。
【讨论】:
【参考方案3】:我遇到了同样的问题。虽然test.py
和mycode.c
在同一个文件夹中(/home/user/python/example),但我必须在Py_Initialize();
之后添加对路径的引用,如下行所示
PyRun_SimpleString ("import sys; sys.path.insert(0, '/home/user/python/spp')");*
将 /home... 替换为您的路径。
我之前的代码没有那行代码,但 PyImport_Import
正在工作,而 PyObject_GetAttrString
没有。对我来说毫无意义,“别问我,我不知道 - Ozzy”。
【讨论】:
以上是关于PyObject_GetAttrString C++ 函数返回 NULL:无法从 C++ 调用 Python 函数的主要内容,如果未能解决你的问题,请参考以下文章