Я хотел попробовать встроить Python в C++. Мне удалось заставить это работать, но я хотел начать писать отпечатки с переменными, объявленными в С++. Например:
(С++)
int num = 43;
PyRun_SimpleString("print("+num+")");
char g;
std::cin>>g;
PyRun_SimpleString("print("+g+")");
Я пытался выяснить, как использовать другие связанные функции, но не нашел достаточно информации.
Чтобы передать символ,
Скрипт 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/
Я обновил свой код от инициализации до получения результатов, так что это проще. поскольку вы можете запустить pyrunsimplestring, это означает, что у вашего встраивания нет проблем. «script» — это имя вашего файла Python, script.py. а "тест" - это имя вашей функции. можешь попробовать понять
Спасибо, но я столкнулся с нарушением прав доступа. Это вызывается на линии pFunc. Я установил файл py; нужно ли что-то делать с модулем?
Строка pFunc загружает скрипт. означает, что, возможно, он не может найти ваш скрипт. убедитесь, что имя указано правильно, а сценарий находится в вашей среде. вы можете протестировать его, добавив скрипт в тот же каталог вашего исполняемого файла С++ ИЛИ вы можете установить переменную среды PATH для вашего пользователя/администратора, где бы ни находился ваш каталог файлов python.
Да, у меня есть файл py внутри той же папки, что и мой файл cpp.
Хм, я не уверен, как вы запускаете свои файлы cpp. Лучше указать путь среды к вашему файлу python. Вы можете обратиться к инструкциям здесь 0> docs.oracle.com/en/database/oracle/machine-learning/oml4r/1.5.1/…
wdym, где мой exe? Нравится релизный файл @sin han jinn
@ user20342224 да, есть много способов запустить cpp. да, я имел в виду ваш файл выпуска. Вы пробовали путь среды?
Итак, я переместил py в папку выпуска, которая решила первую проблему; но теперь есть еще одна ошибка в PyObject_CallObject(). Теперь я получаю nullptr от pFunc.
Я использовал PyErr_Print(); и получил «AttributeError: модуль« скрипт »не имеет атрибута« тест »». Это не кажется правильным. Тест должен быть модулем??
Я думаю, проблема в том, что мой файл py закодирован в западной Европе.
«тест» должен быть функцией, определенной в вашем скрипте Python. возможно, в вашем сценарии структура отличается. вы можете увидеть примерную структуру выше. вам, возможно, придется немного изучить, если вы хотите соответствовать другой структуре.
ОМГ Я ТАКОЙ ТУПОЙ!!! У меня был дубликат файла с тем же именем, и я печатал вместо фактического файла в выпуске! ОГРОМНОЕ СПАСИБО, что так долго помогали мне :)
Нда, ты не тупой, это случается со всеми :) Лучший совет - всегда делай передышку, когда не можешь что-то исправить, когда вернешься, то почти наверняка их решишь. Приветствую, однако!
Если вы не возражаете, я спрошу, но как бы вы использовали это? Я совсем не знаком с этим.