错误"Session/line number was not unique in database."与 Python 代码之间的依赖关系



一段时间以来,我收到以下错误(警告?

错误!会话/行号在数据库中不是唯一的。历史记录日志记录已移至新会话

使用 Jupyter 笔记本时(<XXXX>是一个数字,例如 9149)。 由于Spyder报告了相同的错误(Spyder的警告:"会话/行号在数据库中不唯一"),我的猜测是IPython内核日志记录存在一些问题。

问题是:运行我的代码和错误之间有什么关系吗?

错误可能是由我的代码引起的吗?我触摸IPython API,如下所示:

import IPython 
def beep():
Python.display.display(IPython.display.Audio(url="http://www.w3schools.com/html/horse.ogg", autoplay=True))
def play_sound(self, etype, value, tb, tb_offset=None):
self.showtraceback((etype, value, tb), tb_offset=tb_offset)
beep()
get_ipython().set_custom_exc((Exception,), play_sound)

我在代码中使用beep()函数。我还处理导致MemoryError异常的大数据。

更重要的是,错误可能会影响我的代码行为(假设我不尝试访问日志)?

[编辑] 这个问题似乎与Spyder的警告不同:"会话/行号在数据库中不是唯一的",因为我能够使用Jupyter Notebook重现它,但不能使用Spyder。

这只是部分答案——赏金仍然有资格。

该错误确实取决于我的代码 - 至少当有SyntaxError时。

我用以下三个单元格复制了它。

In [31]: print(1)
1
In [31]: print 2
File "<ipython-input-32-9d8034018fb9>", line 1
print 2
^
SyntaxError: Missing parentheses in call to 'print'
In [32]: print(2)
2
ERROR! Session/line number was not unique in database. History logging moved to new session 7

如您所见,第二个单元格中的行计数器没有增加(存在语法问题)。

受到@zwer评论的启发,我查询了$HOME/.ipython/profile_default/history.sqlite数据库:

sqlite> select session, line, source from history where line > 30;
6|31|print(1)
6|32|print 2
7|32|print(2)

很明显,第二个单元格的行计数器在数据库中增加了,但在笔记本中没有增加。

因此,当第三个单元格成功执行时,笔记本尝试使用相同的行存储其源代码,这违反了PRIMARY KEY约束:

sqlite> .schema history
CREATE TABLE history
(session integer, line integer, source text, source_raw text,
PRIMARY KEY (session, line));

因此,已触发故障保护,该故障保护发出警告并创建新会话。

我想这个问题不会影响我的代码行为,但是我错过了这种声明的可靠来源。

当我尝试在 jupyter 笔记本中运行一些异步代码时,我遇到了同样的错误。要点是这样的(对于那些熟悉 asyncio 的人来说可能是有意义的)

cell #1 
output = loop.run_until_complete(future)
cell #2
print(output)

同时运行两个单元格,我会得到 OP 的错误。 像这样将单元格合并在一起,它运行干净

cell #1 
output = loop.run_until_complete(future)
print(output)

当 Jupyter 笔记本单元格具有相同的行号时,会出现此问题。
如果你在Jupyter Notebook中,你可以做的是重新启动内核。
错误将得到解决。

最新更新