有没有办法在程序执行期间产生交互式python控制台(最好是iPython)而不会暂停主程序并能够检查和修改程序变量?类似于浏览器为JavaScript提供的东西.
我知道pdb.set_trace()和IPython.embed(),但他们都暂停程序执行,并要求将它们放在程序的源代码中.
这对于python中的桌面游戏开发来说非常有用.
您可以使用以下方法自行推出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,请尝试一下。
| 归档时间: |
|
| 查看次数: |
1723 次 |
| 最近记录: |