PyObject_GetAttrString c++函数返回NULL:无法从c++调用Python函数
PyObject_GetAttrString C++ function returning NULL: Unable to call Python functions from C++
我刚开始用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,所以我想做一个更简单的测试,我仍然收到NULL后调用PyObject_GetAttrString。从我的理解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代码中遗漏了一个步骤。
将Python脚本名称从test.py
更改为其他任何名称对我都有效。
我也遇到了同样的问题。虽然test.py
和mycode.c
在同一个文件夹中(/home/user/python/example),但我必须在Py_Initialize();
之后添加一个引用,如下行
PyRun_SimpleString ("import sys; sys.path.insert(0, '/home/user/python/spp')");*
替换/回家……去你的路。
我以前的代码没有那行代码,但PyImport_Import
工作和PyObject_GetAttrString
没有。对我来说没有意义,"别问我,我不知道"
我也遇到过类似的问题。我发现我传递给python的字符串中的空白是错误的。据我所知,你的打印语句有6个空格而不是4个。备份一下,看看是不是一切都不清楚。
- "error: no matching function for call to"构造函数错误
- 什么时候调用组成单元对象的析构函数
- 继承函数的重载解析
- 为什么随机数生成器不在void函数中随机化数字,而在main函数中随机化
- C++模板来检查友元函数的存在
- 递归函数计算序列中的平方和(并输出过程)
- 对RValue对象调用的LValue ref限定成员函数
- C++17复制构造函数,在std::unordereded_map上进行深度复制
- 将数组作为参数传递给函数安全吗?作为第三方职能部门,可以探索他们想要的之外的其他元素
- 在C++STL中是否有Polyval(Matlab函数)等价物?
- 为什么使用 "this" 指针调用派生成员函数?
- 将对象数组的引用传递给函数
- 函数调用中参数的顺序重要吗
- 函数向量_指针有不同的原型,我可以构建一个吗
- 使用不带参数的函数访问结构元素
- 代码在main()中运行,但在函数中出现错误
- 内置函数可查看CPP中的成员变量
- 如何获取std::result_of函数的返回类型
- 如何在c++中为模板函数实例创建快捷方式
- 如果C++类在类方法中具有动态分配,但没有构造函数/析构函数或任何非静态成员,那么它仍然是POD类型吗