有两种方法可以让我不由自主地想到做到这一点。第一种方法是使用exec 执行用户输入代码。
while True:
user_input = input("Python command to execute: ")
try:
exec(user_input)
except Exception as e:
print("Error thrown.")
但是,这有其局限性。您必须编写一些自定义代码来捕获错误、适当地抛出错误等。第二种方法涉及更多,但也更通用。您使用everything is a file 方法,并将用户输入(无论是通过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)
您可能会发现this 的答案是我对另一个(模糊相关)问题的有趣且有用的问题。
关于下文。通知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