Jupyter 笔记本文件版本控制问题及解决方案

引言

今天(10月21日)参加在上海壹号码头艺术酒店举办中国 Python 开发者大会(PyCon China 2018) 。会上多位 Pythoneer 的做了生动活泼的知识分享,如 JupyterPyTorchpyenvpyethvnpyNumba 等,知识干货很多。

问题提出

上午提问环节中有小伙伴问到 Jupyter 笔记本文件(扩展名:ipynb)版本控制问题。估计演讲者没碰到这个问题,或者没有好的结局方案,回答是确实不好解决,Jupyter 笔记本使用 JSON 文件格式存储。由于 JSON 格式的原因,Jupyter 笔记本稍有变动,Jupyter 笔记本文件(JSON 格式存储)会有较大的不同,Git 版本管理工具没法很好的做版本控制。

解决方案

作为一个 Jupyter 的使用者,前段时间我也碰到了这个问题,踩坑摸索一番,算是“圆满”解决了这个问题。

定义一下方案要解决的问题:”优雅地“用 Git 管理 Jupyter 笔记本的 ipynb 文件修改历史纪录。

解决方案有两个,我推荐第二个方案。

方案一:安装 notedown 插件,使 Jupyter 笔记本可以修改并运行 Markdown 格式的代码,换句话说,用 md 文件替代 ipynb 文件。(这个是从李沐教程中学来的,实践中坑比较多)

安装 notedown 插件,运行 Jupyter 笔记本并加载插件:

pip install https://github.com/aaren/notedown/tarball/master
jupyter notebook --NotebookApp.contents_manager_class='notedown.NotedownContentsManager'

# 也可以这样,不过版本比较低(1.4.2, 最新1.5.0),兼容性也差
# pip install notedown
复制代码

如果你希望每次运行 Jupyter 笔记本时默认开启 notedown 插件,可以参考下面步骤。

首先,执行下面命令生成 Jupyter 笔记本配置文件(如果已经生成可以跳过)。

jupyter notebook --generate-config
复制代码

然后,将下面这一行加入到 Jupyter 笔记本配置文件的末尾(Linux/macOS 上一般在路径~/.jupyter/jupyter_notebook_config.py)

c.NotebookApp.contents_manager_class = 'notedown.NotedownContentsManager'
复制代码

之后,我们只需要运行jupyter notebook命令即可默认开启 notedown 插件。

方案二:安装 nbstripout 工具,使 Git 在保存 Jupyter 笔记本到 Git 版本库时“忽略”输出项,使 outputs 为空,同时保持工作区(working directory)不变。这样做一般不会有问题,其他人在 checkout 后只需要重新运行一次 Jupyter 笔记本即可查看输出内容。

   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "Using TensorFlow backend.\n"
     ]
    }
复制代码

在 Git 项目所在目录中执行 nbstripout 完成配置即可,照常使用 git 各种命令,如 add、checkout、commit、diff 等。只有在确实修改了 code 后,才会产生变更,提交后生成版本纪录。

安装 nbstripout 工具。

nbstripout --install
复制代码

也可以随时卸载 nbstripout 工具。

nbstripout --uninstall
复制代码

这两个命令的实际作用是修改 .git/config 文件

[core]
	repositoryformatversion = 0
	filemode = true
	bare = false
	logallrefupdates = true
	ignorecase = true
	precomposeunicode = true
[filter "nbstripout"]
	clean = \"/Users/ccm/anaconda3/bin/python\" \"/Users/ccm/anaconda3/lib/python3.7/site-packages/nbstripout.py\"
	smudge = cat
	required = true
[diff "ipynb"]
	textconv = \"/Users/ccm/anaconda3/bin/python\" \"/Users/ccm/anaconda3/lib/python3.7/site-packages/nbstripout.py\" -t
复制代码

总结一下,Jupyter 笔记本文件版本控制问题的关键点在于 ipynb 文件储存 outputs 输出,这部分往往是多变的、无需做版本控制的,解决了这个,也就解决了Jupyter 笔记本文件版本控制问题。

转载请注明出处,也欢迎与我交流。

转载于:https://juejin.im/post/5bcc5b035188255c781cf3cb

  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值