我正在使用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代码时,我从命令行通过ipdb运行一个脚本,并设置了许多断点.然后我在一个或多个模块中进行一些更改,然后重新运行.但是,如果我只是使用运行模块,请不要重新加载.为了确保它们存在,我可以存在并完全重新启动Python,但是我需要重置所有断点,如果我有很多并且如果一遍又一遍地完成,那么这很麻烦.
有没有办法将断点保存到(i)pdb中的文件中,这样在不改变行号的小改动后,我可以转储断点,重启Python + pdb,然后重新加载断点?相当于Matlabs X = dbstatus,保存/加载X和设置dbstop(X).
假设我有一个引发意外异常的函数,所以我将它包装在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) 我想使用ipdb而不是pdb与py.test --pdb选项.这可能吗?如果是这样,怎么样?
显然,我可以import ipdb; ipdb.set_trace()在代码中使用,但需要运行测试,观察它失败,打开文件,找到所述文件中的失败点,写上面的行,重新运行测试.如果我可以通过所有这些来获得一些东西,那会很麻烦.
可以通过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)
下面的命令代表了一种在ipdb调试器中打印文档字符串的方法,但这与help(sum)和sum? 在 IPython 外壳中。
ipdb> print(sum.__doc__)
Run Code Online (Sandbox Code Playgroud)
那么如何在 IPython shell 中存在的 …
为了调试我的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笔记本启用自动完成交互式调试?这非常有用,特别是当你有很多长名称的变量时.
我在 Spyder 中以交互方式使用 ipython 调试器。我需要跨模块使用断点进行调试,即我希望调试器进入特定 .py 文件中包含的函数,该文件不是我启动调试器的 .py 文件。
目前,我似乎无法完成这项工作。调试器仅“看到”当前模块中的断点(我在运行调试器之前手动添加)。但我不能拥有这个模块中的每个功能,因为它会变得太大,而且这不是一个好的做法。为了进行测试,我确实需要进入这些较小的通用函数,我希望将它们放置在其他模块中。
谢谢
我正在使用 PyQt 应用程序,因此在开始调试之前,在 Python 文件中,我有pyqtRemoveInputHook()停止事件循环的行,然后ipdb.set_trace(). 这将通过终端进入交互式调试会话。完成调试后,我需要手动在终端中键入c; pyqtRestoreInputHook()以继续运行程序并恢复事件循环。告诉或继续,并且c被解释为 Python 代码。虽然这不是太麻烦,但我想以某种方式创建一个函数,允许 python 命令告诉或者给定的字符串是伪键盘命令。ipdbpdbpyqtRestoreInputHook()ipdbpdb
换句话说,我试图找到一个基本上ipdb.run_user_input(my_string)可以my_string是任何正常函数ipdb或pdb函数(如next、c、step、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。有什么办法解决这个问题吗?
我有一个在 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
我如何摆脱这个警告?不可能那样工作
ipdb ×10
python ×8
debugging ×5
pdb ×5
ipython ×3
python-3.x ×3
pytest ×1
spyder ×1
sqlite ×1
ubuntu-18.04 ×1