10

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

我知道pdb.set_trace()and IPython.embed(),但是它们都暂停程序执行并需要将它们放在程序源代码中的某个位置。

这对于用 python 开发桌面游戏非常有用。

4

2 回答 2

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()

用 调用_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()

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

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

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

于 2013-11-03T20:44:25.860 回答
1

我假设您熟悉在 Eclipse 下运行的 PyDev。如果您准备中断主程序(这不是您想要的),这将提供出色的调试功能。但是 PyDev 有一个称为运行调试服务器的功能,它允许附加到现有的正在运行的程序。我自己没试过,但是建议你看看,因为 PyDev 是一个优秀的 Eclipse 插件。如果你尝试一下,我会对你的想法感兴趣。尝试查看:

http://pydev.org/manual_adv_remote_debugger.html

详情。祝你好运。

于 2013-11-03T19:59:49.577 回答