【问题标题】:Dependency between "Session/line number was not unique in database." error and Python code“会话/行号在数据库中不是唯一的”之间的依赖关系。错误和 Python 代码
【发布时间】:2018-05-16 11:39:08
【问题描述】:

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

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

使用 Jupyter 笔记本时(<XXXX> 是一个数字,例如 9149)。 由于 Spyder (Spyder's Warning: "Session/line number not unique in database") 报告了同样的错误,我猜测 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's Warning: "Session/line number not unique in database" 不同,因为我可以使用 Jupyter Notebook 但不能使用 Spyder 来重现它。

【问题讨论】:

  • 你到底在做什么?我看到一些关于 beep 函数的语法问题?
  • @TarunLalwani 在我的计算完成或引发未处理的异常后定义一个函数和一个挂钩来播放马嘶声。我 100% 确定没有 SyntaxError。
  • 是的,我的错误没有水平滚动。两件事情。删除日志记录时会发生什么?此外,如果您在函数内移动IPython.display.Audio(url="http://www.w3schools.com/html/horse.ogg", autoplay=True) 并将默认值保持为无。检查是否为 None 然后启动声音
  • @TarunLalwani 我已经删除了logging 模块并重写了beep() 函数 - 警告仍然存在。
  • 这听起来像您的 IPython 历史数据库已损坏。尝试清理它(即删除/临时重新定位您的 $IPYTHONDIR/profile_default/history.sqlite 文件),看看它是否仍然发生。

标签: python python-3.x ipython jupyter-notebook


【解决方案1】:

这只是部分答案 - 赏金仍然符合条件。

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

因此,a failsafe 已被触发,它发出警告并创建了一个新会话。

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

【讨论】:

  • 对我来说也是如此。我的问题的原因是我的脚本以奇怪的格式加密。我只需要将其更改为 UTF-8
【解决方案2】:

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

【讨论】:

  • 问题是重启后状态丢失。并且状态可能值得几天的计算。
  • @abukaj 老兄!不要在 RAM 中存储几天的计算。以某种方式对其进行序列化!泡菜/json/csv/任何东西..
【解决方案3】:

当我尝试在 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)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2023-04-08
    • 1970-01-01
    • 1970-01-01
    • 2012-04-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多