“会话/行号在数据库中不是唯一的”之间的依赖关系。错误和Python代码

新手上路,请多包涵

有一段时间我收到以下错误(警告?):

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

使用 Jupyter Notebook 时( <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。

原文由 abukaj 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 1.7k
2 个回答

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

该错误确实取决于我的代码 - 至少当有 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));

结果,触发 了故障保护,发出警告并创建了一个新会话。

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

原文由 abukaj 发布,翻译遵循 CC BY-SA 4.0 许可协议

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

 cell #1
output = loop.run_until_complete(future)

cell #2
print(output)

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

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

原文由 JoeyC 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题