困在PyObject_GetAttrString():如何从C++代码中获取Python函数脚本

Stuck at PyObject_GetAttrString() : How to get my Python function script from my C++ code

本文关键字:代码 C++ 获取 Python 脚本 函数 GetAttrString PyObject 困在      更新时间:2023-10-16

我的问题是,我无法在C++脚本上从Python脚本中获取函数。

我使用Python/C API,我的IDE是VS代码。当我运行代码时,它停止在调用PyObject_GetAttrString((的特定行

VScode的task.json中的这一行用于构建我的代码:g++-IC:/Users/Martin/AppData/Local/Programs/Python37-32/libs/Python37.a main.cpp-LC:/Users/Martin/AppData\Local/Programs/Python237-32/libs-lpython37

和这行运行它:。\a.exe(由VScode自动创建的.exe(

这是我第一次尝试通过类似的C++代码使用Python代码。我已经在论坛和stackoverflow上的另一个话题上搜索过了,但毕竟我试过了,还是没找到。这是代码:

C++代码:main.cpp(我执行(

#include <iostream>
#include "C:/Users/Martin/AppData/Local/Programs/Python/Python37-32/include/Python.h"
using namespace std;
int main ()
{
cout << "Start n";

Py_Initialize();
cout << "2n";  PyObject* my_module = PyImport_ImportModule("mat");
cout << "3n";  PyObject* my_function = PyObject_GetAttrString(my_module,"getfive");
cout << "4n";  PyObject* my_result = PyObject_CallObject(my_function,NULL);
cout << "5n";  double result = PyFloat_AsDouble(my_result);
cout << "6n";  printf("My result is :  %f",result);
cout << "7n";
Py_Finalize();
return 0;
}

Python代码:mat.py

def getfive():
print "python say 5 !"
return 5
def speak():
print "speak"

输出I除非具有:

Start 1
2
3 
python say 5!
4
5
6
My result is :  5
7

我真正拥有的输出:

Start 1
2
3

在这里,我真的不明白为什么它在这条线上不起作用:";PyObject*my_function=PyObject_GetAttrString(my_module,"speak"(">

谢谢你读到这里,如果你回答我的话,还有更多!

问题是我的python代码错了:我没有把()放在print行。。。如此基本,但我们必须对我们的python代码充满信心,错误可能来自那里!

我使用了PyErr_Print();,这使我们能够从python代码中获得关于错误和异常的特定输出!(更多信息请访问:https://docs.python.org/3/c-api/exceptions.html(

非常感谢Wim Lavrijsen帮助我澄清了我的问题!

这是现在工作的正确代码:

C++代码(main.cpp(:

#include <iostream>
#include "C:/Users/Martin/AppData/Local/Programs/Python/Python37-32/include/Python.h"
using namespace std;
int main ()
{
cout << "Start 1 n";
Py_Initialize();
cout << "2n";  PyObject* my_module = PyImport_ImportModule("mat");
cerr << my_module << "n";
PyErr_Print();
cout << "3n";  PyObject* my_function = PyObject_GetAttrString(my_module,"getfive");
cout << "4n";  PyObject* my_result = PyObject_CallObject(my_function,NULL);
cout << "5n";  int result = _PyLong_AsInt(my_result);
cout << "6n";  printf("My result is :  %d", result);
cout << "n7n";
Py_Finalize();
return 0;
}

Python代码(mat.py(:

def getfive():
print("python say 5 !")
return 5
def speak():
print(speak)

我得到的错误:

SyntaxError: Missing parentheses in call to 'print'. Did you mean print("python say 5 !")?
SyntaxError: Missing parentheses in call to 'print'. Did you mean print("speak")?

我想要的输出

Start 1 
2
0x790600
3
4
python say 5 !
5
6
My result is :  5
7

结论:当您使用te Python/C API时,请使用PyErr_Print()检查Python代码!