Python实时编码/调试

时间:2013-11-03 19:44:58

标签: python debugging

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

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

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

2 个答案:

答案 0 :(得分: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(和stdin)。因此,我不得不将主线程的stdin传递给子进程,事情从那里变得有点hacky。 注意,python 3.2及更低版本中存在一个错误,只要您在exit()进程中调用multiprocessing,就会出现追踪错误。这在3.3中已经修复。

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

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

答案 1 :(得分:1)

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

http://pydev.org/manual_adv_remote_debugger.html

了解详情。祝你好运。