首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >将用户输入插入后端python shell

将用户输入插入后端python shell
EN

Stack Overflow用户
提问于 2020-05-26 02:32:05
回答 1查看 91关注 0票数 0

我正在做一个宠物项目,我试图制作一个命令行版本的木星(我完全理解这听起来有多蠢,“为什么不直接使用Python shell",这只是为了好玩)。我一直在尝试一种在后台启动Python实例的方法,允许我将用户的输入插入到这个shell中。但我就是想不出什么办法。有什么合理的办法吗?

谢谢!

编辑:我正在考虑类似于Jython的东西,但如果可能的话,我宁愿完全用Python来完成。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-05-26 02:45:38

有两种方法可以让我从头上想出办法来做到这一点。第一种方法是使用exec执行用户输入代码。

代码语言:javascript
运行
复制
while True:
    user_input = input("Python command to execute: ")

    try:
        exec(user_input)
    except Exception as e:
        print("Error thrown.")

然而,这是有其局限性的。您必须编写一些自定义代码来捕获错误,适当地抛出错误,等等。第二种方法涉及得更多,但也更一般化。您使用一切都是文件方法,并将用户输入(无论是通过shell、网站还是其他任何方式)作为文件处理。然后,用那个文件执行它。您可以随时打开一个shell,检查文件在执行之前是否已更新:

代码语言:javascript
运行
复制
import hashlib
import runpy
import time

FILE = "./file.py"

def get_file_md5(file_name):
    with open(file_name, "rb") as f:
        return hashlib.md5(f.read()).hexdigest()

md5 = get_file_md5(FILE)
first_run = True

while True:
    current_md5 = get_file_md5(FILE)
    if md5 != current_md5 or first_run:
        first_run = False
        md5 = current_md5

        try:
            runpy.run_path(FILE)
        except Exception as e:
            print("Error", e)
    else:
        time.sleep(1)

您可能会发现,我给出的另一个(模糊相关的)问题的答案很有趣,而且很有用。

与下文有关。请注意exec(object[, globals[, locals]])文档:

在所有情况下,如果省略可选部分,代码将在当前范围内执行。如果只提供全局值,则必须是字典(而不是字典的子类),它将用于全局变量和局部变量。

所以你可以:

代码语言:javascript
运行
复制
exec_globals = {}
exec('a = 10; print(a)', exec_globals)

print("\na in exec_globals: ", 'a' in exec_globals)
print("exec_globals['a'] =", exec_globals['a'])

print("\na in globals(): ", 'a' in globals())
print(a)

以上将产生如下结果:

代码语言:javascript
运行
复制
10

a in exec_globals:  True
exec_globals['a'] = 10

a in globals():  False

Traceback (most recent call last):
  File "test.py", line 7, in <module>
    print(a)
NameError: name 'a' is not defined
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/62013696

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档