Как мне вызвать графический интерфейс .py из .cpp?

Я использую Python 3.8.5 (64-разрядная версия) и Dev-C++ (генерация кода ISO C++11, включает папку включения Python, а в библиотеках также есть папка Python Lib).

Я разработал очень простой и простой графический интерфейс ttk на Python, и все, что мне нужно, это чтобы мой .cpp вызывал графический интерфейс и отправлял и получал данные из него.

До сих пор я заметил, что мне нужно #include <Python.h> и использовать Py_Initialize(); и Py_Finalize(); для чего-то. Я знаю, что могу вызвать .cpp из исходного файла графического интерфейса Python, но мой учитель хочет, чтобы это было наоборот.

Есть ли способ сделать это?

Изменить 1: например, если я запускаю следующий код:

#include <iostream>
#include <Python.h>

using namespace std;

int main()
{
    Py_Initialize();
    cout << Py_GetVersion() << endl;
    PyRun_SimpleString("print('C++ back-end & Python front-end')");
    Py_Finalize();
    return 1;
}

Затем я получаю сообщение об ошибке: Python-C++.cpp:(.text+0x10): неопределенная ссылка на `__imp_Py_Initialize', GetVersion, SimpleStringFlags и Finalize.

Могу ли я сделать это в Visual Studio? Я рву на себе волосы.

Редактировать 2: я получил Embedded Python для работы в Visual Studio. Теперь, как мне импортировать свой Interface.Py с моим .cpp и как использовать его в качестве графического интерфейса?


person Daniel Pantigoso    schedule 08.08.2020    source источник
comment
Просто «вызов GUI и отправка и получение данных из него» может быть сложной задачей и может иметь довольно много значений. Подробнее о цели, пожалуйста?   -  person Davis Herring    schedule 09.08.2020
comment
@DavisHerring Мое домашнее задание — смоделировать программу поступления в университет. Наш профессор сказал нам создать графический интерфейс на Python, а затем заставить С++ (мы можем использовать DevC++ или Visual Studio) вызвать графический интерфейс, поскольку в графическом интерфейсе есть поля ввода и кнопки, которые указывают, является ли пользователь студентом или администратором, хочет зарегистрироваться или сделать другие вещи и т. д. Мне нужно только вызвать Interface.py из .cpp и каким-то образом связать их.   -  person Daniel Pantigoso    schedule 09.08.2020
comment
stackoverflow.com/questions/37238645 / Возможно, это поможет вам...   -  person    schedule 09.08.2020
comment
@HokoLomal Это то, что я нашел, но это не то, чего хочет наш профессор. Она хочет просто скомпилировать и запустить .cpp/exe, и это справится со всем. Он открывает графический интерфейс tkinter (Interface.py), и единственное, что делает графический интерфейс, — это получает ввод/записи и отправляет их в .cpp. .cpp обрабатывает все внутренние вычисления.   -  person Daniel Pantigoso    schedule 09.08.2020


Ответы (1)


//Daniel Pantigoso e Isaac Brenes
#include <iostream>
#include <fstream>
#include <sstream>
#include <string>
#include <stdio.h>
#include <conio.h>
#include <errno.h>
#include <Python.h>

using namespace std;

int main()
{
    FILE* scr;
    Py_Initialize();

    scr = fopen("Interface.py", "r");
    PyRun_SimpleFile(scr, "r");

    Py_Finalize();
    return 1;
}

Вам придется немного повозиться с параметрами Visual Studio, но это выполнимо. Visual Studio должен соответствовать вашей установке Python (64-разрядный Python — x64 VS, 32-разрядный Python — x86). Свойства проекта должны иметь:

  • C/C++
  • Линкер

В C/C++ General: Дополнительные каталоги включения: нажмите кнопку справа -> ‹Edit...› -> кнопка папки -> кнопка ... -> перейдите к месту установки Python -> Python -> Python( ваша версия) -> include -> Select Folder -> Add -> Ok Preprocessor: Preprocessor Definitions: нажмите кнопку справа -> ‹Edit...› -> Copy paste this: _CRT_SECURE_NO_WARNINGS -> Ok

В Linker General: Additional Library Directorys (вам придется сделать это дважды, потому что вам нужно добавить две папки): нажмите кнопку справа -> ‹Edit...› -> кнопка папки -> кнопка ... -> перейдите туда, где установлен ваш Python -> Python -> Python (ваша версия) -> Lib & libs (вы должны добавить эти две, поэтому вам нужно сделать это дважды) -> Выбрать Папка -> Добавить -> ОК

Готово.

person Daniel Pantigoso    schedule 09.08.2020
comment
Это тривиальная часть; как вы собираетесь использовать программу C++, кроме как в качестве замены python foo.py в качестве команды? - person Davis Herring; 09.08.2020
comment
@DavisHerring Я понятия не имею, и мой партнер по домашнему заданию, и я отказался от этой идеи, потому что она отнимала слишком много времени и не хватало ресурсов. Несмотря на то, что мы смогли внедрить Python в C++ и вызвать окно Tkinter, передача данных из полей ввода Tkinter в серверную часть C++ была просто невозможна. Нет ссылок, куда бы мы ни посмотрели. - person Daniel Pantigoso; 09.08.2020
comment
Принципиально несложно предоставить модуль, который может импортировать встроенный скрипт Python и который предоставляет функции обратного вызова, которые скрипт может зарегистрировать в Tkinter. Но без какой-либо информации о том, как работает код C++, трудно быть уверенным, что это именно то, что вам нужно, или привести осмысленный пример. В отсутствие этого этот комментарий и этот ответ не отвечают на вопрос. - person Davis Herring; 09.08.2020
comment
Я понимаю, что в принципе это не сложно, но это своего рода беготня в темноте, когда я не знаю, что я делаю при встраивании и как именно я делаю что-то неправильно :/ Если бы я не не нужно сдавать это за полтора часа, я бы предоставил более содержательный пример с кодом C++. Я обновлю его после того, как включу и немного посплю, так как я работал над этим всю ночь. - person Daniel Pantigoso; 09.08.2020