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.pymycode.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 函数的主要内容,如果未能解决你的问题,请参考以下文章

如何在python中控制c++类对象?

SQL CTE性能是否取决于声明顺序?

C/C++ ceil 函数

C/C++ floor 函数

C语言数组问题?

关于c++/c