有没有办法在程序执行期间生成交互式python控制台(最好是iPython)而不停顿主程序并能够检查和修改程序变量?类似于浏览器为JavaScript提供的东西。
我知道pdb.set_trace()
和IPython.embed()
,但他们都暂停程序执行,并要求将它们放在程序源代码中的某处。
这对于python中的桌面游戏开发非常有用。
答案 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
了解详情。祝你好运。