从 python 交互式会话中,有没有办法在 with 语句中输入 REPL 循环?
通常,with 语句作为单个块执行
>>>
>>> with app.app_context():
>>> ... # Normally this is executed as a single block, all at once
我希望能够在交互式会话中的上下文中运行代码。
>>>
>>> with app.app_context():
>>> # do stuff here in a REPL loop
您无法完全模仿
with
语句,但您可以通过手动调用 app.app_context().__enter__()
来接近。
如果出现异常,这不会自动
__exit__
,但否则它应该工作相同(完成后您可能需要自己调用 __exit__
,我不确定上下文管理器到底做了什么)。
Python 2.7 中带有
contextmanager
的功能齐全的 REPL,用于非常简单的输入(即无变量声明):
from contextlib import contextmanager
import sys
class app(object):
@contextmanager
def app_context(self):
sys.stdout.write(">>> ")
yield raw_input()
with app().app_context() as output:
while True:
print eval(output)
output = app().app_context().__enter__()
这将需要一些工作来处理任何更复杂的事情 -
eval
是一个碍眼的东西,并且没有好的方法来打破 ^C 之外的循环 - 但它应该可以工作。
您可以使用 code 模块运行自己的 REPL 循环。例如:
import code
with open('test-repl.txt','w+') as f:
code.interact(banner='REPL inside with. Exit with EOF key sequence (try Ctrl+D or Ctrl+Z).',
local=globals(),exitmsg='Leaving REPL')