将IPython笔记本电脑置于版本控制之下的好策略是什么?
笔记本格式非常适合版本控制:如果想要版本控制笔记本和输出,那么这非常有效.当人们只想对输入进行版本控制时,就会产生烦恼,不包括可能是大型二进制blob的单元格输出(也就是"构建产品"),特别是对于电影和情节.特别是,我试图找到一个良好的工作流程:
如上所述,如果我选择包含输出(例如,在使用nbviewer时这是可取的),那么一切都很好.问题是,当我不想要的版本控制输出.有一些工具和脚本可以剥离笔记本的输出,但我经常会遇到以下问题:
Cell/All Output/Clear
菜单选项相比,剥离输出的一些脚本会稍微改变格式,从而在差异中产生不必要的噪声.这可以通过一些答案来解决.我已经考虑过几个选项,我将在下面讨论,但还没有找到一个很好的综合解决方案.完整的解决方案可能需要对IPython进行一些更改,或者可能依赖于一些简单的外部脚本.我目前使用mercurial,但想要一个也适用于git的解决方案:理想的解决方案是版本控制不可知.
这个问题已经多次讨论过,但从用户的角度来看,没有明确或明确的解决方案.这个问题的答案应该提供明确的策略.如果它需要最近的(甚至开发)版本的IPython或一个易于安装的扩展,这很好.
更新:我一直在玩我修改过的笔记本版本,可以选择.clean
使用Gregory Crosswhite的建议保存每次保存的版本.这满足了我的大多数约束,但是仍然没有解决以下问题:
.clean
文件,然后需要以某种方式集成到我的工作版本中.(当然,我总是可以重新执行笔记本,但这可能会很痛苦,特别是如果某些结果取决于长时间的计算,并行计算等).我还不知道如何解决这个问题.也许涉及像ipycache这样的扩展的工作流可能会起作用,但这似乎有点过于复杂.Cell/All Output/Clear
菜单选项删除输出.如何设置MathJax"序言"以便在IPython(或Jupyter)笔记本中重复使用,方便其他人阅读我的文档(在http://nbviewer.org上)并且适用于LaTeX/PDF代?
我想使用IPython(现在是Jupyter)笔记本来处理我后来通过LaTeX(使用ipython nbconvert
)转换为PDF的文档.问题是如何在几乎每个文档中包含一堆宏定义.就像是:
\newcommand{\vect}[1]{\vec{#1}}
\newcommand{\abs}[1]{\lvert#1\rvert}
\DeclareMathOperator{\erf}{erf}
Run Code Online (Sandbox Code Playgroud)
就笔记本电脑而言,一个令人不满意的解决方案是将它们简单地包含在笔记本顶部的降价单元中,嵌入两个美元符号之间,$$
因此它被解释为数学.如果这是在一些介绍性文本之后完成的,那么它甚至不会影响输出.
问题是,当转换为LaTeX(用于PDF导出)时,这些命令嵌入在LaTeX文件的数学环境中.这有几个问题:
\DeclareMathOperator
必须出现在LaTeX文档前言中.\gdef
或者克服来解决,\global\def
但是必须要求MathJax识别这些命令,其中某些东西\let\gdef{\def}
在某种程度上是从LaTeX中隐藏的.我发现使这项工作的任何方式都相当于一个丑陋的黑客.)\renewcommand
(MathJax不支持,但也可以由\let\renewcommand\newcommand
等等提供,这对我来说似乎是合理的,因为MathJax无法知道前导码可能用于最终的LaTeX文件) .可能解决方案是通过添加代码(不确定等效于此处......)为MathJax提供一组宏\DeclareMathOperator
.
<script type="text/x-mathjax-config">
MathJax.Hub.Config({
TeX: {
Macros: {
vect: ["{\\vec #1}",1],
abs: ["{\\lvert #1 \\rvert}",1]
}
}
});
</script>
Run Code Online (Sandbox Code Playgroud)
到custom.js
文件,然后在转换为PDF时提供包含的LaTeX包.我对这种方法的问题是:如何custom.js
为其他人(协作者和查看者)分发文件和LaTeX样式文件?
我希望协作者能够编辑和阅读我的文档,而无需在其全局配置中安装自定义扩展.具体来说,我可以要求他们运行一个命令,就像python setup.py configure
他们下载/签出我的代码一样,对项目进行本地修改,比如ipython_notebook_config.py
在包含笔记本的所有目录中填充文件,但是不喜欢安装扩展或修改他们的个人全局custom.js
文件.
我的绊脚石是我不知道如何将本地custom.js
文件中的贡献添加到笔记本链中,并怀疑这可能违反了安全策略.
最好的解决方案不需要我的协作者的任何操作.
我希望我的笔记本能够在http://nbviewer.org上工作,并且人们能够下载笔记本并制作PDF.(我认为这排除了使用 …
这可能看起来很矛盾,我知道秘密更改集应该是私有的,但如果我想备份这些秘密更改集怎么办?
我平行地与一些分支机构合作,有时候我想推一个分支机构,而不是其他分支机构.为了达到这个目的,我在不同的克隆工作,但我讨厌这个.
所以现在mercurial有阶段,我可以建立秘密分支,并在同一个存储库中拥有所有内容.问题是在秘密分支的开始和它的发布之间,我想要备份那些秘密变更集(我在另一台机器上有一个克隆,只是为了保存我的备份以防万一我的本地仓库或我的机器发生了什么).
有没有办法做到这一点或我的工作流程是完全错误的?
当我无法访问远程文件时,如何告诉mercurial远程服务器(例如bitbucket)是非发布的.hg/hgrc
?
最近版本的mercurial有一个阶段概念,允许用户跟踪哪些变更集已被共享(public
),哪些变量集没有(draft
).更改集rebase
允许存储库更改操作draft
,但不允许更改集,public
因为其他操作可能取决于后者.
将更改集推送到公共服务器将public
默认将其阶段更改为,但如果服务器是私有的或专用于代码审查(即人们不应该提取),则推送到"非发布"服务器不应更改相.
该记录的方式告诉善变的服务器是不公开的是将增加[phases]
部分到.hg/hgrc
文件服务器上:
[phases]
publishing = false
Run Code Online (Sandbox Code Playgroud)
在我看来应该有一种方法可以在我的一个本地hgrc
文件中包含一行说明特定服务器是非发布的,但我找不到任何文档来建议如何.也许这个行为可以用钩子定制?
我可以让内置的类型,如int
与double
在C++命名空间中可用?
#include <complex>
typedef int my_int;
namespace my_namespace {
namespace std = ::std; // Works
using ::my_int; // Works
using ::int; // Fails: "expected unqualified-id before 'int'"
typedef ::int int; // Fails: "expected unqualified-id before 'int'"
}
typedef int out::int; // Fails: "expected unqualified-id before 'int'"
my_namespace::my_int x; // Works
my_namespace::std::complex<int> c; // Works
// I would like to use this:
my_namespace::int x2; // Fails: "expected unqualified-id before 'int'"
Run Code Online (Sandbox Code Playgroud)
我怀疑这是由于语言限制,禁止在其中使用带有关键字的限定标识符(int
在本例中),但我希望有一些方法可以揭示这些.
我正在尝试使用命名空间来组织类型,以便外部工具(SWIG)可以适当地用另一种语言包装函数.例如: …