abu*_*kaj 6 python ipython python-3.x jupyter-notebook
有一段时间我收到以下错误(警告?):
错误!会话/行号在数据库中不是唯一的.历史记录日志已移至新会话
使用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)
Run Code Online (Sandbox Code Playgroud)
我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
Run Code Online (Sandbox Code Playgroud)
正如您所看到的,第二个单元格中的行计数器没有增加(有语法问题)。
受@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)
Run Code Online (Sandbox Code Playgroud)
很明显,数据库中第二个单元格的行计数器已增加,但笔记本中却没有增加。
因此,当第三个单元格成功执行时,笔记本尝试使用同一行存储其源代码,这违反了约束PRIMARY KEY:
sqlite> .schema history
CREATE TABLE history
(session integer, line integer, source text, source_raw text,
PRIMARY KEY (session, line));
Run Code Online (Sandbox Code Playgroud)
结果,触发了故障保护,发出警告并创建了一个新会话。
我想这个问题不会影响我的代码行为,但是我错过了此类声明的可靠来源。
| 归档时间: |
|
| 查看次数: |
1322 次 |
| 最近记录: |