困在PyObject_GetAttrString():如何从C++代码中获取Python函数脚本
Stuck at PyObject_GetAttrString() : How to get my Python function script from my C++ code
我的问题是,我无法在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代码!
- C++我的数学有什么问题,为什么我的代码不能正确循环
- 代码在main()中运行,但在函数中出现错误
- 在VS代码中交叉编译Windows与Linux上的MinGW的SDL程序
- 编译包含字符串的代码时遇到问题
- 我在c++代码中生成了一个运行时#3异常
- 如何在linux终端中同时编译和运行c++代码
- 为cl.exe(Visual Studio代码)指定命令行C++版本
- 在Linux for Windows上编译C++代码时出错
- 我的字符计数代码计算错误.为什么
- 孤立代码块在结构中引发异常
- 在编译C++代码(具有dlib和opencv)到WASM时面临问题
- 为什么我的C#代码在调用回C++COM直到Task时会暂停.等待/线程.加入
- 处理小于cpu数据总线的数据类型.(c++转换为机器代码)
- 此代码是否违反一个定义规则
- 为什么我的代码在输出中增加了93天
- 我的简单if-else语句是如何无法访问的代码
- 使用动态分配的数组会导致代码分析发出虚假的C6386缓冲区溢出警告
- 为什么在这个代码结束循环中没有得到结束
- 在c代码之间共享数据的最佳方式
- 这个指针和内存代码打印是什么?我不知道是打印垃圾还是如何打印我需要的值