Python-如何执行代码并将其存储到变量中?

问题描述 投票:1回答:2

因此,我一直在为这个问题而苦苦挣扎,直到现在为止(我对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")

[想法是,当您要求它向您问好时,将从#.yml文件中检索^ ## ^ print(“ HELLO”)字符串,响应的前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

Output on the website interface

基本上,对于“代码eval:的结果:”输出,需要说HELLO。这应该可以使聊天机器人在Web界面中使用HELLO进行响应,这是此处的最终目标。在“要执行的代码为:”输出文本之后,由于HELLO的缘故,它似乎正在执行代码。它只是不像我需要的那样将其存储到变量中。

[我已经尝试过 eval,exec,ast.literal_eval(),使用str()将输入转换为字符串,更改单引号和双引号,将\放在引号对之前,以及其他一些操作。每当我到达程序执行代码时解释“ print(“ HELLO”)“的位置时,就会抱怨语法。另外,从几天的在线观察中,我发现由于一系列问题,exec和eval通常并不受欢迎,但是我现在真的不在乎,因为我在尝试做出一些可行的事情,然后再尝试做点好事,行之有效的事。我觉得问题是像过去一样小而愚蠢的,但是我不知道这可能是什么。 :(

我将这两个资源用作整个聊天机器人项目的基础:

Text Guide

Youtube Guide

[此外,对于冗长和描述性的问题,我感到抱歉。我很少在stackoverflow上问自己一个问题,因为如果我有问题,通常已经有了一个很好的答案。感觉到我现在已经尝试了一切。如果您对如何使用整个系统有更好的建议,或者您认为我应该尝试以其他方式进行处理,那么我欢迎您提出意见。

谢谢您的任何/所有帮助。非常感谢!:)

python python-3.x chatbot execution evaluation
2个回答
0
投票

问题是python的print()没有返回值,这意味着它将始终返回Noneeval简单地计算某些表达式,然后从该表达式返回返回值。由于print()返回None,因此某些打印语句的eval也将返回None


0
投票

很容易进行转换,尝试创建一个新列表并将该变量的更新值添加到其中,例如:

© www.soinside.com 2019 - 2024. All rights reserved.