标签: ipdb

ipdb,多线程和自动加载程序导致ProgrammingError

我正在使用ipdb调试器在本地调试多线程Web应用程序(Django,Plone).由于我在调试提示符时发生的自动重载,ipdb似乎常常感到困惑.产生的堆栈跟踪出现了

    /Users/mikko/code/xxxx/venv/lib/python2.7/site-packages/IPython/core/history.pyc in writeout_cache(self, conn)
        605         with self.db_input_cache_lock:
        606             try:
    --> 607                 self._writeout_input_cache(conn)
        608             except sqlite3.IntegrityError:
        609                 self.new_session(conn)

    /Users/mikko/code/xxxx/venv/lib/python2.7/site-packages/IPython/core/history.pyc in _writeout_input_cache(self, conn)
        589             for line in self.db_input_cache:
        590                 conn.execute("INSERT INTO history VALUES (?, ?, ?, ?)",
    --> 591                                 (self.session_number,)+line)
        592
        593     def _writeout_output_cache(self, conn):

    ProgrammingError: SQLite objects created in a thread can only be used in that same thread.The object was created in thread id 4546363392 and this is thread id 140735211872640
Run Code Online (Sandbox Code Playgroud)

在此之后,程序无法关闭(挂起线程)或ipdb本身停止工作.

有没有办法用ipdb迁移这个问题,并使其更安全多线程/自动重载?

编辑:稍微澄清了一下这个问题,因为我认为这可能是IPython问题的根本原因.可能存在某种解决方法,使得IPython只是在重新加载时丢弃历史记录或禁用有问题的IPython SQLite以其他方式写入.

python sqlite ipython pdb ipdb

6
推荐指数
1
解决办法
1290
查看次数

将断点保存到文件

在调试我的Python代码时,我从命令行通过ipdb运行一个脚本,并设置了许多断点.然后我在一个或多个模块中进行一些更改,然后重新运行.但是,如果我只是使用运行模块,请不要重新加载.为了确保它们存在,我可以存在并完全重新启动Python,但是我需要重置所有断点,如果我有很多并且如果一遍又一遍地完成,那么这很麻烦.

有没有办法将断点保存到(i)pdb中的文件中,这样在不改变行号的小改动后,我可以转储断点,重启Python + pdb,然后重新加载断点?相当于Matlabs X = dbstatus,保存/加载X和设置dbstop(X).

python debugging pdb ipdb

6
推荐指数
1
解决办法
848
查看次数

如何从堆栈跟踪中提取局部变量?

假设我有一个引发意外异常的函数,所以我将它包装在ipdb中:

def boom(x, y):
    try:
        x / y
    except Exception as e:
        import ipdb; ipdb.set_trace()

def main():
    x = 2
    y = 0
    boom(x, y)

if __name__ == '__main__':
    main()
Run Code Online (Sandbox Code Playgroud)

我可以向上移动堆栈以找出x和y具有的值:

$ python crash.py 
> /tmp/crash.py(6)boom()
      5     except Exception as e:
----> 6         import ipdb; ipdb.set_trace()
      7 

ipdb> u
> /tmp/crash.py(11)main()
     10     y = 0
---> 11     boom(x, y)
     12 

ipdb> p y
0
Run Code Online (Sandbox Code Playgroud)

但是,在调试时,我想把调试器放在最顶层:

def boom(x, y):
    x / y

def main():
    x = 2
    y = 0
    boom(x, …
Run Code Online (Sandbox Code Playgroud)

python pdb ipdb

6
推荐指数
1
解决办法
758
查看次数

使用ipdb而不是pdb和py.test --pdb选项

我想使用ipdb而不是pdbpy.test --pdb选项.这可能吗?如果是这样,怎么样?

显然,我可以import ipdb; ipdb.set_trace()在代码中使用,但需要运行测试,观察它失败,打开文件,找到所述文件中的失败点,写上面的行,重新运行测试.如果我可以通过所有这些来获得一些东西,那会很麻烦.

python pytest pdb ipdb

6
推荐指数
2
解决办法
1841
查看次数

ipdb 调试器中的 IPython 帮助功能

可以通过help命令或使用? 特点。例如,对于内置sum函数的帮助,可以使用 IPython shell 中的以下任一命令。

In [1]: help(sum)
Help on built-in function sum in module builtin:
...

In [2]: sum?
Signature: sum(iterable, start=0, /)
Docstring: ...
Run Code Online (Sandbox Code Playgroud)

我想在ipdb调试器中具有相同的功能。通过将以下代码放置在调试断点的位置,可以进入ipdb调试器。

from ipdb import set_trace
set_trace()
Run Code Online (Sandbox Code Playgroud)

但是,一旦进入ipdb调试器,帮助功能就不再起作用。

ipdb> help(sum)
*** No help for '(sum)'
ipdb> sum?
*** SyntaxError: invalid syntax
ipdb>
Run Code Online (Sandbox Code Playgroud)

IPython shell 和 ipdb 调试器中的帮助

下面的命令代表了一种在ipdb调试器中打印文档字符串的方法,但这与help(sum)sum? 在 IPython 外壳中。

ipdb> print(sum.__doc__)
Run Code Online (Sandbox Code Playgroud)

那么如何在 IPython shell 中存在的 …

python debugging ipython ipdb

6
推荐指数
1
解决办法
552
查看次数

在IPython(Jupyter)笔记本中进行交互式调试

为了调试我的python代码,我使用了ipdb库,并使用set_trace()命令来设置断点.一旦代码到达那里,我得到一个带有ipdb>提示的交互式shell ,我可以使用制表符自动完成来探索局部变量.

但是,在IPython(Jupyter)笔记本中,ipdb.set_trace()它不起作用.正如这篇文章所建议的: 使用ipdb在一个单元格中调试python代码(jupyter或Ipython)

我使用以下替代方法进行交互式调试:

from IPython.core.debugger import Tracer
Tracer()() #this one triggers the debugger
Run Code Online (Sandbox Code Playgroud)

这为我提供了ipdb>提示,但标签自动完成功能不可用.无论如何使用ipython笔记本启用自动完成交互式调试?这非常有用,特别是当你有很多长名称的变量时.

python debugging ipython ipdb jupyter-notebook

6
推荐指数
1
解决办法
3597
查看次数

Python:是否可以在 Spyder 中跨模块使用断点进行调试?

我在 Spyder 中以交互方式使用 ipython 调试器。我需要跨模块使用断点进行调试,即我希望调试器进入特定 .py 文件中包含的函数,该文件不是我启动调试器的 .py 文件。

目前,我似乎无法完成这项工作。调试器仅“看到”当前模块中的断点(我在运行调试器之前手动添加)。但我不能拥有这个模块中的每个功能,因为它会变得太大,而且这不是一个好的做法。为了进行测试,我确实需要进入这些较小的通用函数,我希望将它们放置在其他模块中。

谢谢

python debugging spyder ipdb

6
推荐指数
0
解决办法
1487
查看次数

在 Python 中以编程方式执行用户输入的 pdb 或 ipdb 命令

我正在使用 PyQt 应用程序,因此在开始调试之前,在 Python 文件中,我有pyqtRemoveInputHook()停止事件循环的行,然后ipdb.set_trace(). 这将通过终端进入交互式调试会话。完成调试后,我需要手动在终端中键入c; pyqtRestoreInputHook()以继续运行程序并恢复事件循环。告诉或继续,并且c被解释为 Python 代码。虽然这不是太麻烦,但我想以某种方式创建一个函数,允许 python 命令告诉或者给定的字符串是伪键盘命令。ipdbpdbpyqtRestoreInputHook()ipdbpdb

换句话说,我试图找到一个基本上ipdb.run_user_input(my_string)可以my_string是任何正常函数ipdbpdb函数(如nextcsteplist等)的函数。

谢谢!

python-3.x pdb ipdb

6
推荐指数
1
解决办法
890
查看次数

在 ipdb 会话中如何使用 list()?

在 Python 3.5.2 脚本中,我有,例如

import ipdb
ipdb.set_trace()
Run Code Online (Sandbox Code Playgroud)

口译员听到这些台词后,我就进入了一个ipdb会话。可以理解的是,ipdb与 iPython 解释器会话相比,其功能有限(例如,没有魔法命令)。然而,我惊讶地发现一些 Python 内置函数不起作用,即list().

ipdb> some_data                                                                                                                                               
<zip object at 0x7f416e820388>
ipdb> list(some_data)                                                                                                                                         
*** Error in argument: '(some_data)'
ipdb> list([])                                                                                                                                                
*** Error in argument: '([])'
Run Code Online (Sandbox Code Playgroud)

我猜测内置函数list()和命令之一之间存在名称冲突ipdb。有什么办法解决这个问题吗?

python python-3.x ipdb

6
推荐指数
1
解决办法
860
查看次数

在使用 ipdb ResourceWarning 进行 unitest 时调试 python 代码

我有一个在 Ubuntu 16 上运行良好的 Python 代码。我安装了 Ubuntu 18,现在当我在执行 unitest 时尝试调试代码时,每次按“n”或“s”时都会收到以下警告:

ipdb> /usr/lib/python3.7/asyncio/base_events.py:618: ResourceWarning: unclosed event loop <_UnixSelectorEventLoop running=False closed=False debug=False>
  source=self)
ResourceWarning: Enable tracemalloc to get the object allocation traceback
Run Code Online (Sandbox Code Playgroud)

我使用 python 3.7.5

我如何摆脱这个警告?不可能那样工作

debugging python-3.x ipdb ubuntu-18.04

6
推荐指数
1
解决办法
352
查看次数