Так что я боролся с этой проблемой сейчас, кажется, навсегда (я довольно новичок в Python). Я использую Python 3.7 (нужно, чтобы он был 3.7 из-за различий в версиях пакетов, которые я использую для проекта), чтобы разработать систему чат-бита AI, которая может общаться с вами на основе вашего ввода текста , Программа читает содержимое ряда файлов .yml при запуске. В одном из файлов .yml я разрабатываю синтаксис для случая, когда первые 5 символов соответствуют шаблону ^ ### ^, он вместо этого выполнит код и вернет результат этого выполнения, а не просто выведет текст обратно пользователю. Например:
Обычный разговор:
- - What is AI?
- Artificial Intelligence is the branch of engineering and science devoted to constructing machines that think.
Разговор на основе службы / кода:
- - Say hello to me
- ^###^print("HELLO")
Идея состоит в том, что когда вы просите его передать вам привет строка ^ ## ^ print ("HELLO") будет извлечена из файла .yml, первые 5 символов ответа будут удалены, ответ будет отправлен отдельной функции в коде python, где он запустит код и сохранит результат в переменной, которая будет возвращена из функции в переменную, которая выдаст хороший, чистый результат HELLO пользователю. Я понимаю, что это может быть немного сложным для понимания, но я исправлю свой код и сгущу все, как только исправлю всю эту ошибку. В качестве примечания: Oracle - это то, что я называю проектом. Я не пытаюсь впутать Java во весь этот беспорядок.
ПРОБЛЕМА заключается в том, что он не сохраняет результат запуска / исполнения / оценки кода в переменную, например это должно быть.
Мой код:
def executecode(input):
print("The code to be executed is: ",input)
#note: the input may occasionally have single quotes and/or double quotes in the input string
result = eval("{}".format(input))
print ("The result of the code eval: ", result)
test = eval("2+2")
test
print(test)
return result
@app.route("/get")
def get_bot_response():
userText = request.args.get('msg')
print("Oracle INTERPRETED input: ", userText)
ChatbotResponse = str(english_bot.get_response(userText))
print("CHATBOT RESPONSE VARIABLE: ", ChatbotResponse)
#The interpreted string was a request due to the ^###^ pattern in front of the response in the custom .yml file
if ChatbotResponse[:5] == '^###^':
print("---SERVICE REQUEST---")
print(executecode(ChatbotResponse[5:]))
interpreter_response = executecode(ChatbotResponse[5:])
print("Oracle RESPONDED with: ", interpreter_response)
else:
print("Oracle RESPONDED with: ", ChatbotResponse)
return ChatbotResponse
Когда я запускаю этот код, это вывод:
Oracle INTERPRETED input: How much RAM do you have?
CHATBOT RESPONSE VARIABLE: ^###^print("HELLO")
---SERVICE REQUEST---
The code to be executed is: print("HELLO")
HELLO
The result of the code eval: None
4
None
The code to be executed is: print("HELLO")
HELLO
The result of the code eval: None
4
Oracle RESPONDED with: None
Вывод на интерфейс веб-сайта
По сути, нужно сказать HELLO для вывода «Результат кода eval:». Это должно привести к тому, что чат-бот отвечает HELLO в веб-интерфейсе, что является конечной целью здесь. Кажется, что он выполняет код из-за HELLO после «Код, который должен быть выполнен:», текст вывода. Он просто не хранится в переменной, как мне нужно.
Я пытался eval, exe c, ast.literal_eval (), преобразовывая ввод в строку с помощью str (), изменяя одинарные и двойные кавычки, помещая \ перед парами цитаты и несколько других вещей. Всякий раз, когда я получаю его там, где программа интерпретирует «print (« HELLO »)» при выполнении кода, она жалуется на синтаксис. Кроме того, за несколько дней поиска в Интернете я понял, что exe c и eval, как правило, не пользуются популярностью из-за множества проблем, однако в настоящий момент меня это не волнует, потому что я пытаюсь сделать что-то, что работает, прежде чем я сделаю что-то хорошее и работает. У меня такое чувство, что проблема в чем-то маленьком и глупом, как всегда, но я понятия не имею, что это может быть. : (
Я использовал эти 2 ресурса в качестве основы для всего проекта чата:
Текстовое руководство
Руководство Youtube
Кроме того, я прошу прощения за довольно длинный и описательный вопрос. Редко, когда я задаю свой вопрос на stackoverflow, потому что если у меня есть вопрос, он обычно уже имеет хороший ответ. как будто я все перепробовал на этом этапе. Если у вас есть лучшее предложение о том, как сделать всю эту систему, или вы думаете, что я должен попытаться подойти к этому по-другому, я открыт для идей.
Спасибо за любую помощь. Очень ценим! :)