Python实时编码/调试

Han*_*ody 10 python debugging

有没有办法在程序执行期间产生交互式python控制台(最好是iPython)而不会暂停主程序并能够检查和修改程序变量?类似于浏览器为JavaScript提供的东西.

我知道pdb.set_trace()IPython.embed(),但他们都暂停程序执行,并要求将它们放在程序的源代码中.

这对于python中的桌面游戏开发来说非常有用.

roi*_*ppi 4

您可以使用以下方法自行推出threading

#!/usr/bin/python3

def _spawn_background_interpreter(*args,**kwargs):
    from threading import Thread
    def _open_interp(locs):
        import code
        code.interact(local=locs)
    locs = args[0] if args else None
    t = Thread(target=_open_interp, args=(locs,))
    t.setDaemon(True) #pre-3.3 API
    t.start()
Run Code Online (Sandbox Code Playgroud)

致电_spawn_background_interpreter(locals()).

我还没有测试过它,但是如果你的程序不连续地将东西打印到控制台,这可能没问题 - 否则它将与交互式解释器一起混合在一起。

“打开一个新控制台”的想法很有趣,但非常特定于环境,所以我不会解决这个问题。如果有更好的预打包解决方案,我会很感兴趣。

编辑:尝试解决multiprocessing方案:

def _spawn_background_interpreter(*args,**kwargs):
    from multiprocessing import Process
    import sys, os
    def _open_interp(locs,stdin):
        import code
        sys.stdin = os.fdopen(stdin)
        code.interact(local=locs)
    locs = args[0] if args else None
    fileno = sys.stdin.fileno()
    p = Process(target=_open_interp, args=(locs,fileno))
    p.daemon = True
    p.start()
Run Code Online (Sandbox Code Playgroud)

我最初避免的原因multiprocessing是每个新进程都有自己的 PID(和标准输入)。因此,我必须将主线程的标准输入传递给子进程,从那里开始事情变得有点棘手。 请注意exit(),python 3.2 及更低版本中存在一个错误,该错误会导致您在进程中调用时出现回溯multiprocessing。这在 3.3 中已修复。

不幸的是,该multiprocessing代码只能在 POSIX 兼容的系统上运行 - 即不能在 Windows 上运行。并非不可克服,只是需要一个涉及管道的更复杂的解决方案。

无论如何,multiprocessing如果您的主线程中的 CPU 利用率接近 100%,那么该实现可能会为您带来更好的性能。如果您使用 *nix,请尝试一下。