with 语句中的 Python 交互式 REPL

问题描述 投票:0回答:3

从 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
python python-3.x ipython
3个回答
7
投票

您无法完全模仿

with
语句,但您可以通过手动调用
app.app_context().__enter__()
来接近。

如果出现异常,这不会自动

__exit__
,但否则它应该工作相同(完成后您可能需要自己调用
__exit__
,我不确定上下文管理器到底做了什么)。


0
投票

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 之外的循环 - 但它应该可以工作。


0
投票

您可以使用 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')
© www.soinside.com 2019 - 2024. All rights reserved.