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

时间:2018-05-16 11:39:09

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

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

  

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

使用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重现它。

3 个答案:

答案 0 :(得分: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));

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

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

答案 1 :(得分:0)

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

答案 2 :(得分:0)

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