Застрял в PyObject_GetAttrString (): Как получить мой скрипт функции Python из моего кода C ++ - PullRequest
0 голосов
/ 03 ноября 2019

Итак, моя проблема в том, что я не могу получить функцию из моего скрипта Python на моем скрипте c ++.

Я использую Python / C API, и моя IDE - VScode. Когда я запускаю код, он останавливается на определенной строке, вызывающей PyObject_GetAttrString ()

Эта строка в файле task.json из VScode используется для создания моего кода: g ++ -IC: / Users / Martin / AppData / Local/Programs/Python/Python37-32/libs/python37.a main.cpp -LC: / Users / Martin / AppData / Local / Программы / Python / Python37-32 / libs -lpython37

И эта строказапустите его:. \ a.exe (.exe, автоматически созданный VScode)

Впервые я пытаюсь использовать код Python через код C ++, подобный этому. Я уже искал в форумах и по другим темам на stackoverflow, но в конце концов я попробовал, я не понимаю. Вот код:

Код C ++: main.cpp (который я выполняю)

#include "C:/Users/Martin/AppData/Local/Programs/Python/Python37-32/include/Python.h"
using namespace std;

int main ()
{
    cout << "Start \n";

    Py_Initialize();
    cout << "2\n";  PyObject* my_module = PyImport_ImportModule("mat");
    cout << "3\n";  PyObject* my_function = PyObject_GetAttrString(my_module,"getfive");
    cout << "4\n";  PyObject* my_result = PyObject_CallObject(my_function,NULL);
    cout << "5\n";  double result = PyFloat_AsDouble(my_result);
    cout << "6\n";  printf("My result is :  %f",result);
    cout << "7\n";
    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, "говори"); "

Спасибо, что прочитали это далеко, и многое другое, если вы мне отвечаете!

1 Ответ

0 голосов
/ 05 ноября 2019

Проблема заключалась в том, что мой код на Python был неправильным: я не поместил () в мои print строки ... Так просто, но мы должны быть осторожны с нашим кодом Python, ошибка может возникнуть!

Я использовал PyErr_Print();, это позволяет нам получить конкретный вывод об ошибках и исключениях, которые вы можете получить из своего кода Python! (больше информации там: https://docs.python.org/3/c-api/exceptions.html)

Огромное спасибо Виму Лаврийсену за помощь в разъяснении моей проблемы!

Вот правильный код, который работает сейчас:

Код 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 << "2\n";  PyObject* my_module = PyImport_ImportModule("mat");
    cerr << my_module << "\n";
    PyErr_Print();
    cout << "3\n";  PyObject* my_function = PyObject_GetAttrString(my_module,"getfive");
    cout << "4\n";  PyObject* my_result = PyObject_CallObject(my_function,NULL);
    cout << "5\n";  int result = _PyLong_AsInt(my_result);
    cout << "6\n";  printf("My result is :  %d", result);
    cout << "\n7\n";
    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

ВЫВОД: Когда вы работаете с API Python / C, используйте PyErr_Print(), чтобы проверить код Python!

...