55

我厌倦了插入

import pdb; pdb.set_trace()

进入我的 Python 程序并通过控制台进行调试。如何连接远程调试器并从文明的用户界面插入断点?

4

5 回答 5

56

使用Winpdb。它是一个独立于平台的图形 GPL Python 调试器,支持通过网络进行远程调试、多线程、命名空间修改、嵌入式调试、加密通信,并且比 pdb 快 20 倍。

特征:

  • GPL 许可证。Winpdb 是免费软件。
  • 与 CPython 2.3 到 2.6 和 Python 3000 兼容
  • 与 wxPython 2.6 到 2.8 兼容
  • 独立于平台,并在 Ubuntu Gutsy 和 Windows XP 上测试。
  • 用户界面:rpdb2 是基于控制台的,而 winpdb 需要 wxPython 2.6 或更高版本。

截屏
(来源:winpdb.org

于 2009-02-13T05:32:18.313 回答
17

好吧,你可以得到与使用扭曲沙井非常相似的东西,它的工作原理如下:

from twisted.internet import reactor
from twisted.cred import portal, checkers 
from twisted.conch import manhole, manhole_ssh 

def getManholeFactory(namespace):
    realm = manhole_ssh.TerminalRealm()
    def getManhole(_): 
        return manhole.Manhole(namespace) 
    realm.chainedProtocolFactory.protocolFactory = getManhole
    p = portal.Portal(realm)
    p.registerChecker(
        checkers.InMemoryUsernamePassword DatabaseDontUse(admin='foobar'))
    f = manhole_ssh.ConchFactory(p)
    return f

reactor.listenTCP(2222, getManholeFactory(globals()))
reactor.run() 

然后你只需通过 ssh 登录程序;

$ ssh admin@localhost -p 2222
admin@localhost's password: 

使用foobar作为密码。

当你登录时,你会得到一个正常的 python 提示,你可以在其中戳数据。这与将回溯发送到主机并不完全相同。

现在,这可能很难集成到 GUI 程序中,在这种情况下,您可能需要选择另一个反应器,例如对于使用 gtk2reactor 等的基于 gtk 的程序。

如果您希望发送实际的回溯,您需要为 stderr、stdin 和 stdout 创建一个套接字通道,该通道通过网络而不是打印到本地主机。使用twisted应该不会太难完成。

于 2009-02-12T21:07:19.540 回答
16

有点晚了,但这是一个非常轻量级的远程调试解决方案,由http://michaeldehaan.net/post/35403909347/tips-on-using-debuggers-with-ansible提供:

  1. pip install epdb在远程主机上。
  2. 确保您的防火墙设置不允许非本地连接到远程主机上的端口 8080,因为epdb默认侦听任何地址 ( INADDR_ANY),而不是 127.0.0.1。
  3. 而不是import pdb; pdb.set_trace()在你的程序中使用,使用import epdb; epdb.serve().
  4. 安全登录到远程主机,因为epdb.connect()使用 telnet。
  5. 使用 附加到程序python -c 'import epdb; epdb.connect()'

当然,调整安全位以适应您的本地网络设置和安全立场。

于 2015-04-04T21:55:19.330 回答
3

来自现代 IDE 的两种解决方案:

  1. PTVS跨平台远程调试

  2. PyCharm/PyDev 远程调试

于 2015-03-02T15:37:29.857 回答
0

我发现 pudb 在紧急情况下很有用

pip install pudb

项目描述 https://pypi.org/project/pudb/

教程: https ://vimeo.com/5255125

于 2020-08-06T12:09:02.397 回答