如何在当前命名空间中获取Python交互式控制台?

16

我想在Python代码中使用类似于code.interact()的方法启动Python交互式控制台(REPL),但是code.interact()所启动的控制台看不到当前命名空间中的变量. 我要如何实现下面这样的功能:

mystring="hello"

code.interact()

...然后在启动的交互式控制台中,输入mystring应该返回"hello". 这可行吗?我需要将code.interact()函数的"local"参数设置为什么?应该如何调用它?


参考链接:https://www.digitalocean.com/community/tutorials/how-to-debug-python-with-an-interactive-console - zx1986
5个回答

28

尝试:

code.interact(local=locals())

24
如果你想要使用全局变量,可以使用以下代码:code.interact(local=dict(globals(), **locals())) - m01
有没有可能将更改(例如a=3232)从控制台反馈回调用脚本? - lalala

4

进行调试时,我通常使用以下方法:

from pdb import set_trace; set_trace()

可能会有所帮助


1

针对Python 3.10.0:

code.InteractiveConsole(locals=locals()).interact()

查看Python文档以获取更多详细信息。


1
你的回答可以通过添加更多支持信息来改进。请[编辑]以添加进一步的细节,例如引用或文档,以便其他人可以确认你的答案是正确的。您可以在帮助中心找到有关如何编写良好答案的更多信息。 - Community

1

另一种方法是启动调试器,然后运行interact

import pdb
pdb.set_trace()

然后从调试器中:
(Pdb) help interact
interact

        Start an interactive interpreter whose global namespace
        contains all the (global and local) names found in the current scope.
(Pdb) interact
*interactive*
>>>

1
如何从code.interact中同时改变globals()和locals()
不幸的是,code.interact不允许您从当前命名空间传递globals()和locals(),除非您将它们复制到一个单独的字典中,例如code.interact(local={**globals(), **locals()}),但是对globals()和locals()所做的更改将不会被保留。
然而,您可以通过子类化控制台并重写其runcode方法来解决这个问题:
import code
try:
    import readline
except ImportError:
    pass

class MyInteractiveConsole(code.InteractiveConsole):
    """Extends InteractiveConsole to also pass globals to exec."""
    def __init__(self, globals, *args, **kwargs):
        code.InteractiveConsole.__init__(self, *args, **kwargs)
        self.globals = globals
    def runcode(self, code):
        try:
            exec(code, self.globals, self.locals)
        except SystemExit:
            raise
        except:
            self.showtraceback()

在某个地方定义了这个之后,你可以像使用code.interact一样使用它。
MyInteractiveConsole(globals(), locals()).interact()

除了这个,它还允许你读取和修改全局变量和局部变量:
  • x = 7 将设置一个局部变量
  • global x; x = 7 将设置一个全局变量
当你使用 Ctrl+D(或者在 Windows 上使用 Ctrl+Z 然后按 Enter)离开交互式控制台时,你所做的更改应该会保留在你的 globals()locals() 中。
注意:locals() 的文档 警告:

不应该修改这个字典的内容;对解释器使用的局部变量和自由变量的值可能不会受到影响。

因此,在关键任务中不要依赖于对 locals() 的这些修改。PEP 558PEP 667 提供了更详细的信息,并且可能会使 locals() 在未来的 Python 版本中行为更加一致。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接