Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/google-apps-script/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Version control 在版本控制下使用IPython笔记本电脑_Version Control_Ipython_Jupyter Notebook - Fatal编程技术网

Version control 在版本控制下使用IPython笔记本电脑

Version control 在版本控制下使用IPython笔记本电脑,version-control,ipython,jupyter-notebook,Version Control,Ipython,Jupyter Notebook,让笔记本电脑处于版本控制之下的好策略是什么 笔记本格式非常适合进行版本控制:如果想要对笔记本和输出进行版本控制,那么这种方式非常有效。当一个人只想对输入进行版本控制,而不想对单元格输出进行版本控制时,麻烦就来了。构建可以是大型二进制blob的产品,特别是用于电影和情节的产品。特别是,我试图找到一个好的工作流程: 允许我在包含或排除输出之间进行选择, 防止我在不需要时意外提交输出, 允许我以本地版本保存输出, 允许我使用版本控制系统查看何时输入发生更改,即如果我仅对输入进行版本控制,但本地文件有输

让笔记本电脑处于版本控制之下的好策略是什么

笔记本格式非常适合进行版本控制:如果想要对笔记本和输出进行版本控制,那么这种方式非常有效。当一个人只想对输入进行版本控制,而不想对单元格输出进行版本控制时,麻烦就来了。构建可以是大型二进制blob的产品,特别是用于电影和情节的产品。特别是,我试图找到一个好的工作流程:

允许我在包含或排除输出之间进行选择, 防止我在不需要时意外提交输出, 允许我以本地版本保存输出, 允许我使用版本控制系统查看何时输入发生更改,即如果我仅对输入进行版本控制,但本地文件有输出,则我希望能够查看输入是否已更改,需要提交。使用版本控制状态命令将始终注册差异,因为本地文件具有输出。 允许我更新我的工作笔记本,其中包含更新的干净笔记本的输出。使现代化 如前所述,如果我选择在使用示例时包含所需的输出,那么一切都很好。问题是当我不想对输出进行版本控制时。有一些工具和脚本用于剥离笔记本的输出,但我经常遇到以下问题:

我不小心提交了一个带有输出的版本,从而污染了我的存储库。 我清除输出以使用版本控制,但实际上更愿意将输出保存在本地副本中,例如,有时需要一段时间才能复制。 与Cell/All output/Clear菜单选项相比,剥离输出的一些脚本稍微改变了格式,从而在diff中产生了不需要的噪声。一些答案解决了这一问题。 当将更改拉到文件的干净版本时,我需要找到某种方法将这些更改合并到我的工作笔记本中,而不必重新运行所有操作。 使现代化 我已经考虑了几个我将在下面讨论的选项,但还没有找到一个好的全面解决方案。完整的解决方案可能需要对IPython进行一些更改,或者可能依赖于一些简单的外部脚本。我目前正在使用,但希望有一个解决方案也可以使用:理想的解决方案是版本控制不可知

这个问题已经讨论过很多次了,但从用户的角度来看,还没有确定或明确的解决方案。这个问题的答案应该提供明确的策略。如果它需要最新的开发版本或易于安装的扩展,就可以了

更新:我一直在玩的版本,可以选择保存一个。干净的版本,每次保存使用。这满足了我的大部分约束条件,但仍存在以下问题:

这还不是标准解决方案,需要修改ipython源。有没有一种方法可以通过简单的扩展实现这种行为?需要某种形式的自救。 当前工作流的一个问题是拉取更改。这些将进入.clean文件,然后需要以某种方式集成到我的工作版本中。当然,我总是可以重新执行笔记本,但这可能是一个痛苦,特别是如果一些结果依赖于长时间计算、并行计算等。我还不知道如何解决这个问题。也许一个包含扩展的工作流可能会起作用,但这似乎有点太复杂了。 笔记 去除剥离输出 笔记本运行时,可以使用Cell/All Output/Clear菜单选项删除输出。 有一些用于删除输出的脚本,例如删除输出的脚本,但不会产生与使用笔记本界面相同的输出。这最终包含在回购协议中,但该协议已被关闭,声明变更现在包含在回购协议中,但相应的功能似乎尚未包含在内。如上所述的更新表明,即使不调用,这也是非常容易做到的,所以如果能够正确地连接,这种方法可能是可行的。然而,将其连接到每个版本控制系统似乎不是一个好主意-这应该以某种方式连接到笔记本机制。 新闻组 . 问题 . . 从。 . 延期解决。 拉取请求 . 另见。 . . . 这似乎极为相关,但最后建议使用清洁/污迹过滤器。一个相关的问题似乎没有得到回答。 . . 这是重新设定的。 . .
不幸的是,我对Mercurial知之甚少,但我可以为您提供一个与Git一起工作的可能解决方案,希望您能够将我的Git命令转换为Mercurial等效命令

对于后台,在Git中,add命令将对文件所做的更改存储到临时区域。一旦你做到了这一点, Git将忽略对文件的任何后续更改,除非您告诉它也将这些更改暂存。因此,下面的脚本,对于每个给定的文件,都会删除所有输出和提示符编号部分,暂存剥离的文件,然后恢复原始文件:

注意:如果运行此命令会得到一条错误消息,如ImportError:No module named IPython.nbformat,则使用IPython来运行脚本,而不是python

从IPython.nbformat导入当前 输入io 从操作系统导入删除,重命名 从shutil导入复制文件 从子流程导入Popen 从系统导入argv 对于argv[1:]中的文件名: 备份当前文件 备份\文件名=文件名+.backup copyfilefilename,备份文件名 尝试: 在笔记本上读 使用io.openfilename,'r',将='utf-8'编码为f: notebook=current.readsf.read,格式=ipynb 去掉所有输出和提示_编号部分 对于笔记本[工作表]中的工作表: 对于工作表中的单元格[单元格]: cell.outputs=[] 如果在单元格中提示\u编号: 删除单元格[提示编号] 写剥离文件 使用io.openfilename'w',将='utf-8'编码为f: current.writenotebook,f,format='ipynb' 运行git add以暂存非输出更改 printgit添加,文件名 Popen[git,add,filename]。请稍候 最后: 恢复原始文件;需要移除,以防 我们正在windows中运行。 删除文件名 重命名备份文件名,文件名
脚本在要提交更改的文件上运行后,只需运行git commit。

这是我的git解决方案。它允许您像往常一样添加、提交和区分:这些操作不会改变您的工作树,同时重新运行笔记本也不会改变您的git历史记录

虽然这可能适用于其他VCS,但我知道它至少不能满足VSC不可知性的要求。尽管如此,它对我来说还是完美的,尽管它并没有什么特别出色的地方,而且很多人可能已经在使用它了,但我并没有通过谷歌搜索找到关于如何实现它的明确说明。因此,它可能对其他人有用

将文件保存到某处,以便执行以下操作:假设~/bin/ipynb_output_filter.py 使其可执行chmod+x~/bin/ipynb_output_filter.py 使用以下内容创建文件~/.gittributes

*.ipynb    filter=dropoutput_ipynb
运行以下命令:

git config --global core.attributesfile ~/.gitattributes
git config --global filter.dropoutput_ipynb.clean ~/bin/ipynb_output_filter.py
git config --global filter.dropoutput_ipynb.smudge cat
完成了

限制:

它只适用于git 在git中,如果您在分支somebranch中,并且您执行git签出otherbranch;git签出分支时,您通常希望工作树保持不变。在这里,您将丢失两个分支之间来源不同的笔记本电脑的输出和单元格编号。 更一般地说,输出根本没有版本控制,就像Gregory的解决方案一样。为了避免每次执行涉及签出的任何操作时都将其丢弃,可以通过将其存储在单独的文件中来改变方法,但请注意,在运行上述代码时,提交id未知!,并可能对其进行版本控制,但请注意,这需要的不仅仅是git commit notebook_file.ipynb,尽管它至少可以使git diff notebook_file.ipynb免于base64垃圾。 也就是说,顺便说一句,如果您确实提取代码,即由其他人提交的代码,而不是使用包含一些输出的这种方法,那么输出将正常检出。只有本地生产的产品丢失。 我的解决方案反映了这样一个事实,即我个人不喜欢将生成的内容保持版本化——请注意,执行涉及输出的合并几乎肯定会使输出或您的生产力或两者失效

编辑:

如果您真的按照我的建议采用了解决方案——也就是说,在全球范围内——您将遇到一些问题,以防您想要对输出进行版本转换。因此,如果您想禁用特定git存储库的输出过滤,只需在其中创建一个文件.git/info/attributes,其中包含

**.ipynb过滤器=

作为内容。显然,以同样的方式也可以做相反的事情:只为特定的存储库启用过滤

代码现在以自己的方式维护

如果上述说明导致导入,请尝试在脚本路径之前添加ipython:

git config --global filter.dropoutput_ipynb.clean ipython ~/bin/ipynb_output_filter.py
reload(sys)
sys.setdefaultencoding('utf8')

编辑:2016年5月2017年2月更新:我的脚本有几个备选方案-为了完整性,这里是我知道的方案列表:,。

我使用非常务实的方法;这在多个方面都适用于多个笔记本电脑。它甚至可以让我“转移”笔记本。它既适用于Windows,也适用于Unix/MacOS。 我觉得很简单,就是解决了上面的问题

概念 基本上,不跟踪.ipnyb文件,只跟踪相应的.py文件。 通过使用-script选项启动笔记本服务器,将自动创建/保存该文件 当笔记本保存时

那些.py文件确实包含所有输入;非代码和单元格边框保存在注释中。可以读取/导入这些文件并将其拖到笔记本服务器中,以重新创建笔记本。只有输出消失了;直到它重新运行

我个人使用mercurial版本跟踪.py文件;并使用普通命令行命令添加、签入等。大多数其他DVC都允许这样做

现在追踪历史很简单;py是小的、文本的、易于区分的。偶尔,我们需要一个克隆分支;在那里启动第二台笔记本服务器,或者旧版本的笔记本服务器,将其签出并导入笔记本服务器,等等

小贴士和窍门 将*.ipynb添加到“.hgignore”,以便Mercurial知道它可以忽略这些文件 创建一个bash脚本,用-script选项启动服务器,并对其进行版本跟踪 保存笔记本会保存.py文件,但不会将其签入。 这是一个缺点:人们可以忘记这一点 这也是一个特性:可以保存一个笔记本并在以后继续,而无需对存储库历史进行集群。 祝愿 在笔记本电脑仪表板上有一个用于签入/添加/等的按钮会很好 一个通过示例进行的签出file@date+rev.py应该会有帮助 要补充这一点需要做很多工作;也许我会这样做一次。到现在为止,我只是手工做的。
我们有一个合作项目,产品是Jupyter笔记本电脑,在过去的六个月里,我们使用了一种非常有效的方法:我们激活自动保存.py文件,并跟踪.ipynb文件和.py文件

这样,如果有人想查看/下载最新的笔记本电脑,他们可以通过github或nbviewer进行查看,如果有人想查看笔记本电脑代码是如何更改的,他们可以查看.py文件的更改

对于Jupyter笔记本服务器,这可以通过添加行来实现

导入操作系统 从子流程导入检查调用 def post_存储模型、操作系统路径、内容管理器: 用于将笔记本转换为.py脚本的post保存挂钩 如果型号['type']!='笔记本': return仅对笔记本电脑执行此操作 d、 fname=os.path.splitos\u路径 检查调用['jupyter','nbconvert','to','script',fname],cwd=d c、 FileContentsManager.post\u save\u hook=post\u save 转到jupyter_notebook_config.py文件并重新启动笔记本服务器

如果不确定要在哪个目录中找到jupyter\u notebook\u config.py文件,可以键入jupyter-config dir,如果在那里找不到该文件,可以通过键入jupyter notebook-generate config来创建它

对于Ipython 3笔记本服务器,这可以通过添加行来实现

导入操作系统 从子流程导入检查调用 def post_存储模型、操作系统路径、内容管理器: 用于将笔记本转换为.py脚本的post保存挂钩 如果型号['type']!='笔记本': return仅对笔记本电脑执行此操作 d、 fname=os.path.splitos\u路径 检查调用[ipython',nbconvert',to',script',fname],cwd=d c、 FileContentsManager.post\u save\u hook=post\u save 转到ipython_notebook_config.py文件并重新启动笔记本服务器。这些行来自github问题的答案,@dror也将它们包含在他的SO答案中

对于Ipython 2笔记本服务器,这可以通过以下方式启动服务器来实现:

ipython notebook --script
或者通过添加行

c.FileNotebookManager.save_script = True
转到ipython_notebook_config.py文件并重新启动笔记本服务器

如果不确定要在哪个目录中找到ipython_notebook_config.py文件,可以键入ipython locate profile default,如果在那里找不到该文件,可以通过键入ipython profile create来创建它

这是:这是一个


我们对此非常满意。

我做了Albert&Rich做的事-不要将.ipynb文件版本化,因为这些文件可能包含图像,这会变得很混乱。相反,请始终运行ipython notebook-script或将c.FileNotebookManager.save_script=True放入配置文件中,以便在保存笔记本时始终创建一个versionable.py文件

要在签出回购协议或切换分支后重新生成笔记本,我将脚本放在存储笔记本的目录中

现在,在签出repo之后,只需运行python py_file_to_notebooks.py来生成ipynb文件。切换分支后,您可能必须运行python py_file_到_notebooks.py-ov来覆盖现有的ipynb文件

为了安全起见,还可以添加 *.ipynb到.gitignore文件


编辑:我不再这样做了,因为A每次你签出一个分支时,你都必须从py文件重新生成你的笔记本,B还有其他东西,比如你丢失的笔记本中的降价。我改为使用git过滤器从笔记本中剥离输出。关于如何做到这一点的讨论如下。

这里是Cyrille Rossant针对IPython 3.0的一个新解决方案,它坚持使用标记文件,而不是基于json的ipymd文件:

正如所指出的,3.x中不推荐使用-script . 这种方法可以通过应用post save挂钩来使用。特别是,将以下内容添加到ipython_notebook_config.py中:

导入操作系统 从子流程导入检查调用 def post_存储模型、操作系统路径、内容管理器: 用于将笔记本转换为.py脚本的post保存挂钩 如果型号['type']!='笔记本': return仅对笔记本电脑执行此操作 d、 fname=os.path.splitos\u路径 检查调用[ipython',nbconvert',to',script',fname],cwd=d c、 FileContentsManager.post\u save\u hook=post\u save
代码取自。

好的,因此根据讨论,目前最好的解决方案似乎是制作一个git过滤器,在提交时自动从ipynb文件中剥离输出

以下是我从那次讨论中复制出来的使其工作的方法:

我稍微修改了cfriedline的nbstripout文件,以便在无法导入最新的IPython时给出一个信息性错误: 并将其添加到我的回购协议中,比如在./relative/path/to/strip\u notebook\u输出中

还将file.gittributes文件添加到repo的根目录中,其中包含:

*.ipynb filter=stripoutput
并创建了一个setup_git_filters.sh,其中包含

git config filter.stripoutput.clean "$(git rev-parse --show-toplevel)/relative/path/to/strip_notebook_output" 
git config filter.stripoutput.smudge cat
git config filter.stripoutput.required true

并运行了source setup_git_filters.sh。花哨的$git rev解析。。。问题是要在任何Unix机器上找到您的回购协议的本地路径。

要继续使用Pietro Battiston的优秀脚本,如果您遇到如下Unicode解析错误:

Traceback (most recent call last):
  File "/Users/kwisatz/bin/ipynb_output_filter.py", line 33, in <module>
write(json_in, sys.stdout, NO_CONVERT)
  File "/Users/kwisatz/anaconda/lib/python2.7/site-packages/IPython/nbformat/__init__.py", line 161, in write
fp.write(s)
UnicodeEncodeError: 'ascii' codec can't encode character u'\u2014' in position 11549: ordinal not in range(128)
我已经创建了,基于,它支持Git和Mercurial,多亏了mforbes。它可以在命令行上独立使用,也可以作为筛选器使用,可以通过nbstripout安装/nbstripout卸载在当前存储库中轻松卸载

从或简单地得到它

pip install nbstripout
2017-02

策略

关于提交: 剥离输出>name.ipynb nbstripout, 剥离输出>name.clean.ipynb nbstripout, 始终将nbconvert转换为python:name.ipynb.py nbconvert 始终转换为标记:name.ipynb.md nbconvert,ipymd vcs.configure: git difftool、mergetool:nbdiff和nbdime中的nbmerge 工具

nbstripout:从笔记本中剥离输出 src: src: pip安装和剥离;nbstripout安装 ipynb_输出_过滤器:从笔记本中剥离输出 src: ipymd:在{Jupyter,Markdown,O'Reilly Atlas Markdown,OpenDocument,.py}之间转换 src: nbdime:用于区分和合并Jupyter笔记本电脑的工具。2015 src: 文件: nbdiff:以终端友好的方式比较笔记本电脑 nbdime nbdiff用作git diff工具: nbmerge:具有自动冲突解决功能的笔记本电脑三方合并 nbdime nbmerge用作git合并工具 nbdiff web:向您展示丰富的笔记本渲染差异 nbmerge web:为笔记本电脑提供基于web的三向合并工具 nbshow:以终端友好的方式展示单个笔记本
我已经构建了解决这个问题的python包

它提供了一个具有git语法的CLI,用于跟踪git repo中的/update/diff笔记本

这里有一个例子

# add a notebook to be tracked
gitnb add SomeNotebook.ipynb

# check the changes before commiting
gitnb diff SomeNotebook.ipynb

# commit your changes (to your git repo)
gitnb commit -am "I fixed a bug"
请注意,我使用gitnb commit的最后一步是提交您的git回购。它本质上是一个包装

# get the latest changes from your python notebooks
gitnb update

# commit your changes ** this time with the native git commit **
git commit -am "I fixed a bug"

还有其他几种方法,可以进行配置,使其在每个阶段都需要或多或少的用户输入,但这是一般的想法。

经过深入研究,我终于找到了。它剥离单元格输出数据。您必须将其粘贴到jupyter_notebook_config.py文件中,请参见下面的说明

def scrub_output_pre_save(model, **kwargs):
    """scrub output before saving notebooks"""
    # only run on notebooks
    if model['type'] != 'notebook':
        return
    # only run on nbformat v4
    if model['content']['nbformat'] != 4:
        return

    for cell in model['content']['cells']:
        if cell['cell_type'] != 'code':
            continue
        cell['outputs'] = []
        cell['execution_count'] = None
        # Added by binaryfunt:
        if 'collapsed' in cell['metadata']:
            cell['metadata'].pop('collapsed', 0)

c.FileContentsManager.pre_save_hook = scrub_output_pre_save
发件人:

如果您不确定要在哪个目录中找到jupyter\u notebook\u config.py文件,可以在命令提示符/terminal中键入jupyter-config dir[into command prompt/terminal],如果在那里找不到该文件,可以通过键入jupyter notebook-generate config来创建它


下面的帖子中讨论的想法怎么样,笔记本的输出应该保存在哪里,因为生成它可能需要很长时间,而且它很方便,因为GitHub现在可以渲染笔记本了。添加了用于导出.py文件的自动保存挂钩,用于diff和.html,以便与不使用笔记本或git的团队成员共享


您可以使用这个jupyter扩展。它将使您能够直接将ipython笔记本上传到github

我还制作了一个视频来演示这些步骤-

更新:现在你可以 直接在VisualStudio代码中创建文件。您可以选择编辑 笔记本或转换后的python文件

我终于找到了一种高效而简单的方法,使Jupyter和Git能够很好地配合使用。我仍处于第一步,但我已经认为它比所有其他复杂的解决方案好得多

是一个来自微软的酷的开源代码编辑器。它有一个优秀的Python扩展,现在允许您将其作为Python代码。现在你也可以直接

将笔记本导入到python文件后,所有代码和标记都将放在一个普通python文件中,注释中带有特殊标记。您可以在下图中看到:

您的python文件只包含笔记本输入单元格的内容。输出将在拆分窗口中生成。你有 笔记本中的纯代码,在执行时不会更改。没有与代码混合的输出。没有奇怪的JSON不可理解的格式来分析您的差异

只是纯python代码,您可以轻松识别每个差异

我甚至不再需要对.ipynb文件进行版本设置。我可以在.gitignore中放一个*.ipynb行

需要生成笔记本以发布或与他人共享吗?没问题,只是在交互式python窗口中

如果您直接编辑笔记本,现在有一个图标转换并保存为python脚本。

下面是Visual Studio代码中笔记本的屏幕截图:

我只使用了一天,但最终我可以愉快地将Jupyter与Git结合使用


注意:VSCode代码完成比Jupyter好得多。

刚刚遇到jupytext,它看起来是一个完美的解决方案。它从笔记本中生成一个.py文件,然后使两者保持同步。您可以通过.py文件进行版本控制、差异和合并输入,而不会丢失输出。打开笔记本时,它使用.py作为输入单元格,使用.ipynb作为输出。如果您想在git中包含输出,那么只需添加ipynb即可


与2019年更好的解决方法相比,2016年非常流行的答案是不一致的

有几种选择,最好的答案是Jupytext

赶上

它使用版本控制的方式是将.py和.ipynb文件都放在版本控制中。如果需要输入差异,请查看.py;如果需要最新渲染输出,请查看.ipynb

值得一提的:VS工作室、nbconvert、nbdime、氢


我认为,再多做一点工作,VS studio和/或hydrogen或类似公司将成为该工作流程解决方案中的主导者。

由于存在许多策略和工具来处理笔记本电脑的版本控制,我尝试创建一个流程图,以选择2019年4月创建的合适策略


几年来,我一直在删除笔记本电脑中的输出,现在我试图找到一个更好的解决方案。我现在使用的是我设计的Jupyter笔记本和Jupyter实验室的扩展

Jupytext可以将Jupyter笔记本转换为各种文本格式脚本、标记和R标记。反之亦然。它还提供了将笔记本与其中一种格式配对的选项,以及自动同步笔记本的两种表示形式.ipynb和.md/.py/.R文件

让我解释一下Jupytext是如何回答上述问题的:

允许我在包含或排除输出之间进行选择

.md/.py/.R文件仅包含输入单元格。您应该始终跟踪此文件。仅当要跟踪输出时,才对.ipynb文件进行版本设置

防止我在不需要时意外提交输出

将*.ipynb添加到.gitinore

允许我以本地版本保存输出

输出保存在本地.ipynb文件中

允许我使用版本控制系统查看何时输入发生更改,即如果我仅对输入进行版本控制,但本地文件有输出,则我希望能够查看输入是否已更改,需要提交。使用版本控制状态命令将始终注册差异,因为本地文件具有输出

.py/.R或.md文件上的差异就是您要查找的

允许我更新我的工作笔记本,其中包含更新的干净笔记本的输出。更新

拉取.py/.R或.md文件的最新版本,并在Jupyter Ctrl+R中刷新笔记本。您将从文本文件中获得最新的输入单元格,并从.ipynb文件中获得匹配的输出。内核不受影响,这意味着您的局部变量将被保留—您可以在保留它的地方继续工作

我喜欢Jupytext的地方在于,可以在您喜欢的IDE中编辑.py/.R或.md文件形式的笔记本。通过这种方法,重构笔记本变得很容易。完成后,只需刷新Jupyter中的笔记本即可

如果您想尝试一下:使用pip安装Jupytext并重新启动Jupyter笔记本或实验室编辑器。打开要进行版本控制的笔记本,并使用in-Jupyter笔记本或in-Jupyter Lab将其与标记文件或脚本配对。保存笔记本,您将获得两个文件:原始的.ipynb,以及笔记本承诺的文本表示形式,这非常适合进行版本控制


对于可能感兴趣的人:Jupytext也可以在上找到。

这是2020年4月,Jupyter笔记本版本控制有很多策略和工具。下面是您可以使用的所有工具的简要概述

-适用于笔记本电脑的本地区分和合并

-git筛选器,用于在每次提交前自动删除笔记本输出

-将.py伴奏文件同步到 每个笔记本。您只能提交.py文件

-将笔记本转换为python脚本或HTML或两者,并提交这些备用文件类型

-显示笔记本差异以及GitHub上任何提交或拉取请求的输出。你也可以在笔记本电池上写评论,讨论下面的变化截图


免责声明:我构建了ReviewNB。

我还将添加到suguested中,这是Donald Knuth在1983年设想的最先进的编程环境

它还有一些git钩子,可以提供一些帮助,还有其他命令,如:

nbdev_read_nbs nbdev_clean_nbs nbdev_diff_nbs nbdev_测试 因此,您也可以在编写库时随时创建文档,例如:


除了第一个链接之外,您还可以在此处看到一个视频。

听起来像是一件很好的事情,可以作为问题添加或提交拉取请求,以帮助您实现这一目标。一旦您有了删除输出的工作脚本,在提交see clean/Smude筛选器之前,您可以使用Git clean筛选器自动应用它。@Foobarb问题包含不令人满意的解决方法:每个方法至少有一个限制。现在PR 4175已经合并,一个完整的解决方案可能已经制定出来,但这仍然需要完成。只要我有时间,如果其他人在此期间没有提供令人满意的解决方案,我会尽快回答。@saroele我还没有找到推荐的解决方案:我打算使用-script选项,但该选项已被删除。我正在等待post save钩子实现,届时我认为我将能够提供一个结合多种技术的可接受的解决方案。@mforbes看起来PR是在您发表评论几天后才合并的。你或者比我更有知识的人可以在这里发布一个答案,说明如何使用新功能吗?谢谢你的建议。Mercurial并没有像git那样的暂存区,尽管可以用于此目的。同时,我尝试将此代码添加到保存钩子,该钩子使用.clean扩展名保存干净的版本。不幸的是,我看不出如何在没有改变的情况下做到这一点,尽管这个改变非常微不足道。我会玩一会儿,看看它是否适合我所有的需要。你如何处理合并你所做的更改的问题?你是不是只能忍受重新生成所有的输出?我认为这是您第二个限制的体现。@zhermes:这个扩展版本应该是OK的。有没有办法将这个git filters方法与外部diff工具一起使用?如果我使用普通命令行工具,则会应用过滤器,但如果我使用meld作为diff工具,则不会应用过滤器。为了避免出现importorror,我不得不修改以上内容,使用ipython:git config-global filter.dropoutput\u ipynb.clean ipython~/bin/ipynb\u output\u filter.pyAwsome解决方案Pietro运行,谢谢:在我的案例中使用您的脚本时,我改变了两件事:1我更喜欢在repo根目录中的.gittributes中声明过滤器,而不是~/.gittributes,s.t。其他人的过滤器与我相同2我将regexp定义为workdir/***.ipynb filter=dropoutput\u ipynb,我把我的大部分笔记本放在workdir/=>中,如果我还想用输出推送一个笔记本并享受github中的书签渲染,我就把它放在该文件夹之外。如何从.py文件返回笔记本?我喜欢这种方法,但是因为IPybB-> PY-> Ippyb可能是有损耗的,我没有认真考虑。这很容易:例如,把它加载到Dead Dead仪表板上。除了输出数据外,任何东西都不会丢失如果这是真的,那么我认为这接近于我的想法,但我似乎记得IPython没有承诺在从.py到.ipynb格式的转换中完全保留数据。有一个–因此,也许这将构成完整解决方案的基础。我在将.py文件转换为.ipynb文件时遇到一些困难。nbconvert似乎还不支持这一点,而且我没有笔记本仪表板,因为我手动运行ipython笔记本。关于如何实现这种向后转换,您有什么一般性的建议吗?当然,从.py到notebook的转换并不是为了实现双向转换。因此,这不可能是一个通用的解决方案,尽管它很适合您。感谢您提供额外的证据,证明使用-script在实践中是有效的。问题是,如果保留图像,实际的笔记本可能会很大。一个理想的解决方案是只跟踪最新的完整笔记本。谢谢@dror,我已经更新了我的答案,提供了minrk的ipython 3.x解决方案,正如您在这里提供的一样。更新:这个解决方案在ipython版本4中被打破,因为Jupyter与ipython的大分裂。要将此解决方案调整为版本4,请使用命令jupyter notebook-generate config创建一个配置文件。命令jupyter-config dir
找出包含配置文件的目录。@Rich给出的代码片段应该添加到名为jupyter_notebook_config.py的文件中。其余的工作与以前一样。除了@mobiusdumpling的点之外,将check_调用['ipython'替换为check_调用否则你会收到一条警告,说ipython nbconvert已被弃用,你应该改用jupyter nbconvert。jupyter v4.1.0,ipython v4.1.2我喜欢这个想法,但经过测试,发现从.py文件转换回.ipynb是有问题的,特别是对于还没有转换器的第4版笔记本电脑目前需要使用v3导入程序,然后转换为v4,我有点担心这一复杂的过程。此外,如果笔记本主要是Julia代码,.py文件不是一个很好的选择!最后,-脚本不推荐使用,所以我认为挂钩是一种方法。链接中的git筛选器解决方案很好,您应该从这里:-感谢您演示如何使用post save hook。不幸的是,正如elsewere所提到的,从.py文件返回到笔记本是有问题的,因此不幸的是,这不是一个完整的解决方案。我有点希望是这样,因为使用diff.py文件代替笔记本是非常好的。也许新功能会很有用。谢谢我现在使用这个技巧来复制-script行为,而不考虑版本控制。起初我有一些问题,所以以防万一我可以节省一些时间:1如果概要文件文件夹中缺少ipython_notebook_config.py,请运行ipython profile create生成它。2如果似乎忽略了保存后挂钩,请运行ipython with-debug来诊断问题。3如果脚本因错误导入而失败,错误提示:没有名为mistune的模块-simple install minstue:pip install mistune。似乎还不支持Jupyter。我正在将ipymd成功地用于最新的Jupyter-您是否收到任何特定的问题或错误消息?我要指出,此解决方案永远不会保存任何错误信息放入磁盘,并在某种程度上独立于版本控制问题。我正在考虑一个工作流程,在该工作流程中,我保留使用上述post save HOOK自动创建的.ipynb和相应的.py。我想使用.py作为diff-nbstripout是否能够从[1]中的单元格执行计数器中清除.py文件更改为[*],这样他们就不会弄乱差异,或者我应该创建一个简单的脚本来完成吗?@KrzysztofSłowiński不,nbstripout不容易支持这个用例,因为它依赖于笔记本的JSON格式。你可能最好编写一个专门针对你的用例的脚本。你能解释一下这是什么吗?这个脚本并不特别非常清晰。@AlexMonras这将直接在jupyter笔记本中添加一个按钮,您可以使用提交消息将笔记本推送到GitHub repo。我还没有机会深入查看,但这似乎不支持Knuth所称的tangling,这是识字编程的主要要点之一。这允许您在顺序对于解释来说是有意义的,同时保留磁盘上所需的适当顺序。例如,似乎从导入语句开始—代码中最不重要的部分。Tangling允许您将此延迟到主要概念描述之后。嗯,不太确定它是否真的处理Tangling,但真正的从该文件生成的python文件是,我添加了一个我没有看过的youtube视频。