PyObject_GetAttrString c++函数返回NULL:无法从c++调用Python函数

PyObject_GetAttrString C++ function returning NULL: Unable to call Python functions from C++

本文关键字:函数 c++ Python 调用 NULL GetAttrString 返回 PyObject      更新时间:2023-10-16

我刚开始用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.pymycode.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个。备份一下,看看是不是一切都不清楚。