我正在做一个宠物项目,我试图制作一个命令行版本的木星(我完全理解这听起来有多蠢,“为什么不直接使用Python shell",这只是为了好玩)。我一直在尝试一种在后台启动Python实例的方法,允许我将用户的输入插入到这个shell中。但我就是想不出什么办法。有什么合理的办法吗?
谢谢!
编辑:我正在考虑类似于Jython的东西,但如果可能的话,我宁愿完全用Python来完成。
发布于 2020-05-25 18:45:38
有两种方法可以让我从头上想出办法来做到这一点。第一种方法是使用exec
执行用户输入代码。
while True:
user_input = input("Python command to execute: ")
try:
exec(user_input)
except Exception as e:
print("Error thrown.")
然而,这是有其局限性的。您必须编写一些自定义代码来捕获错误,适当地抛出错误,等等。第二种方法涉及得更多,但也更一般化。您使用一切都是文件方法,并将用户输入(无论是通过shell、网站还是其他任何方式)作为文件处理。然后,用那个文件执行它。您可以随时打开一个shell,检查文件在执行之前是否已更新:
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]])
文档:
在所有情况下,如果省略可选部分,代码将在当前范围内执行。如果只提供全局值,则必须是字典(而不是字典的子类),它将用于全局变量和局部变量。
所以你可以:
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)
以上将产生如下结果:
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
https://stackoverflow.com/questions/62013696
复制相似问题