Как передать переменную через Python с помощью C++ в Python.h

Я хотел попробовать встроить Python в C++. Мне удалось заставить это работать, но я хотел начать писать отпечатки с переменными, объявленными в С++. Например:

(С++)

int num = 43;
PyRun_SimpleString("print("+num+")");
char g;
std::cin>>g;
PyRun_SimpleString("print("+g+")");

Я пытался выяснить, как использовать другие связанные функции, но не нашел достаточно информации.

Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
0
95
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Чтобы передать символ,

Скрипт Python:

def test(person):
    return "Hello " + person;

С++:

PyObject *pName, *pModule, *pFunc, *pArgs, *pValue;
pName = PyUnicode_FromString((char*)"script");
pModule = PyImport_Import(pName);
pFunc = PyObject_GetAttrString(pModule, (char*)"test");
pArgs = PyTuple_Pack(1, PyUnicode_FromString((char*)"User"));
pValue = PyObject_CallObject(pFunc, pArgs);
auto result = _PyUnicode_AsString(pValue);
std::cout << result << std::endl;

Выход:

Hello User

Чтобы передать целое число, это то же самое, что и выше. Здесь вы переходите на двойной 2.0.

pArgs = PyTuple_Pack(1,PyFloat_FromDouble(2.0));
pValue = PyObject_CallObject(pFunc, pArgs);

Вы можете обратиться ко всем API здесь >> https://docs.python.org/3/c-api/

Если вы не возражаете, я спрошу, но как бы вы использовали это? Я совсем не знаком с этим.

user20342224 24.11.2022 03:29

Я обновил свой код от инициализации до получения результатов, так что это проще. поскольку вы можете запустить pyrunsimplestring, это означает, что у вашего встраивания нет проблем. «script» — это имя вашего файла Python, script.py. а "тест" - это имя вашей функции. можешь попробовать понять

Sin Han Jinn 24.11.2022 03:35

Спасибо, но я столкнулся с нарушением прав доступа. Это вызывается на линии pFunc. Я установил файл py; нужно ли что-то делать с модулем?

user20342224 24.11.2022 03:50

Строка pFunc загружает скрипт. означает, что, возможно, он не может найти ваш скрипт. убедитесь, что имя указано правильно, а сценарий находится в вашей среде. вы можете протестировать его, добавив скрипт в тот же каталог вашего исполняемого файла С++ ИЛИ вы можете установить переменную среды PATH для вашего пользователя/администратора, где бы ни находился ваш каталог файлов python.

Sin Han Jinn 24.11.2022 03:54

Да, у меня есть файл py внутри той же папки, что и мой файл cpp.

user20342224 24.11.2022 03:58

Хм, я не уверен, как вы запускаете свои файлы cpp. Лучше указать путь среды к вашему файлу python. Вы можете обратиться к инструкциям здесь 0> docs.oracle.com/en/database/oracle/machine-learning/oml4r/1.‌​5.1/…

Sin Han Jinn 24.11.2022 04:10

wdym, где мой exe? Нравится релизный файл @sin han jinn

user20342224 24.11.2022 04:13

@ user20342224 да, есть много способов запустить cpp. да, я имел в виду ваш файл выпуска. Вы пробовали путь среды?

Sin Han Jinn 24.11.2022 04:38

Итак, я переместил py в папку выпуска, которая решила первую проблему; но теперь есть еще одна ошибка в PyObject_CallObject(). Теперь я получаю nullptr от pFunc.

user20342224 24.11.2022 04:47

Я использовал PyErr_Print(); и получил «AttributeError: модуль« скрипт »не имеет атрибута« тест »». Это не кажется правильным. Тест должен быть модулем??

user20342224 24.11.2022 05:07

Я думаю, проблема в том, что мой файл py закодирован в западной Европе.

user20342224 24.11.2022 05:13

«тест» должен быть функцией, определенной в вашем скрипте Python. возможно, в вашем сценарии структура отличается. вы можете увидеть примерную структуру выше. вам, возможно, придется немного изучить, если вы хотите соответствовать другой структуре.

Sin Han Jinn 24.11.2022 05:23

ОМГ Я ТАКОЙ ТУПОЙ!!! У меня был дубликат файла с тем же именем, и я печатал вместо фактического файла в выпуске! ОГРОМНОЕ СПАСИБО, что так долго помогали мне :)

user20342224 24.11.2022 05:32

Нда, ты не тупой, это случается со всеми :) Лучший совет - всегда делай передышку, когда не можешь что-то исправить, когда вернешься, то почти наверняка их решишь. Приветствую, однако!

Sin Han Jinn 24.11.2022 06:42

Другие вопросы по теме

Похожие вопросы

«Шаблон класса уже определен» при создании похожих, но разных специализаций
"выражение не может быть присвоено" при попытке присвоить значение элементу массива массивов
Если у нас есть ranges::zip и views::transform, зачем нам ranges::zip_transform?
Привет! Мой алгоритм не работает для n>7, и я не знаю, почему
Концепция ограничения пакета параметров строковыми типами или типами, преобразуемыми в строки
Почему CMake не распространяет каталоги PUBLIC include между библиотеками?
Методы интерфейса агента не будут вызываться при подключении к защищенной сети в DBus
Как перегрузить метод класса двумя параметрами шаблона, чтобы я мог использовать std::function в качестве одного из них?
Я сделал код С++, где нужно передать указатель структуры в функцию
Почему я получаю «ошибку: ссылка на ‘align_val_t’ неоднозначна» с компилятором Intel C++ 2022 при использовании std::inplace_merge?