开发者笔记

开发可编辑安装

要进行可编辑安装,请在克隆的 fastai 目录内执行以下操作:

cd fastai
pip install -e ".[dev]"

这几乎与以下命令相同:

pip install -e .

但添加 [dev] 会告诉 pip 安装 fastai/setup.py 文件中 dev_requirements 字典变量中 dev 组中的可选包。这些额外的依赖项仅由开发者和贡献者需要。

最好不要使用 python setup.py develop 方法 文档

当你想要将代码库与 master 同步时,只需回到克隆的 fastai 目录并更新它:

git pull

你不需要做其他任何事情。

可编辑安装解释

如果你对可编辑安装不熟悉,请参考 可编辑安装 及其 示例

本节将演示可编辑安装如何与 fastai 一起工作,包括一些重要的细微差别,这些细微差别对于理解非常重要。

首先,确保你在正确的 Python 环境 中(conda activate fastai,或者如果你有命名你的环境,可能是使用系统范围的安装,那么你不需要激活任何东西,尽管使用专用的虚拟环境来处理 fastai 要安全得多)。

让我们从卸载 fastai 开始:

pip   uninstall -y fastai
conda uninstall -y fastai

sys.path 是一个系统路径列表,Python 在 import 时使用这些路径来搜索要加载的模块。

在添加可编辑的 fastai 安装之前,我们有以下 sys.path

python -c 'import sys, pprint; pprint.pprint(sys.path)'
['',
 '~/.local/lib/python3.6/site-packages',
 '~/anaconda3/envs/fastai/lib/python3.6/site-packages']

为了使列表更容易比较,删除了几个条目。

现在让我们为 fastai 执行可编辑安装:

cd ~/github
git clone https://github.com/fastai/fastai
cd fastai
pip install -e ".[dev]"

然后我们再看一下 sys.path

python -c 'import sys, pprint; pprint.pprint(sys.path)'
['',
 '~/.local/lib/python3.6/site-packages',
 '~/anaconda3/envs/fastai/lib/python3.6/site-packages',
 '~/github/fastai']

你可以看到,我的 fastai 的 github 检出路径被添加到了 Python 在遇到 import fastai 时将搜索的路径列表的末尾。

这种设置使得可以编辑 ~/github/fastai/fastai/*/*py 下的 Python 模块,并且 Python 会自动加载这些文件到 condafastai 环境内运行的程序中。

你可以看到 Python 和 pip 是如何实现这一点的:

pip uninstall fastai
Uninstalling fastai-1.0.38.dev0:
  Would remove: ~/anaconda3/envs/fastai/lib/python3.6/site-packages/fastai.egg-link

fastai.egg-link 内部,你会发现 ~/github/fastai

这里有一个重要的教训是,你不能让一个正常安装的 fastai 与可编辑安装共存。正如你从 sys.path 的内容中可以看到的,可编辑路径被添加到模块搜索路径的最后。因此,如果你有一个正常安装的 fastai 包,Python 将使用那个而不是可编辑安装,这可能不是你想要的。

这个问题在 pip 中不存在。如果你安装了一个 pip 的 fastai 包,然后跟随一个 pip 的可编辑安装,pip 会在执行可编辑安装之前卸载之前安装的包。如果你尝试在一个 pip 的可编辑安装上安装一个 pip 的 fastai 包,pip 也会这样做。它会正确处理,确保只安装一个版本。

这不是 conda 包的情况。如果你这样做:

conda install -c fastai fastai
cd ~/github/fastai
pip install -e ".[dev]"

你最终会有两个 fastai 的安装,conda 的 fastai 包被 Python 加载,而可编辑安装对 Python 来说实际上是不可见的(因为它会先找到 conda 包):

$ ls -l ~/anaconda3/envs/fastai/lib/python3.6/site-packages/fastai*
~/anaconda3/envs/fastai/lib/python3.6/site-packages/fastai
~/anaconda3/envs/fastai/lib/python3.6/site-packages/fastai-1.0.37-py3.7.egg-info

所以如果你脚本化你的可编辑安装,一定要确保卸载任何之前安装的 conda fastai 包:

pip   uninstall -y fastai
conda uninstall -y fastai
cd ~/github/fastai
pip install -e ".[dev]"

另外,注意 conda 也可以执行可编辑安装:

cd ~/github/fastai
conda develop .
python -c 'import sys, pprint; pprint.pprint(sys.path)'
['',
 '~/.local/lib/python3.6/site-packages',
 '~/anaconda3/envs/fastai/lib/python3.6/site-packages',
 '~/github/fastai']

它与 pip 完全相同,只是它通过编辑 ~/anaconda3/envs/fastai/lib/python3.6/site-packages/conda.pth 来执行。

因此,你可能会认为,如果 conda 是你首选的方式,那么使用这种方法更好。

我们不推荐使用这种方法,因为,它与 conda 的正常安装不兼容(正常的 conda 包安装会在运行时取代可编辑的安装)。与 pip 不同,conda 的正常包对其可编辑版本一无所知,反之亦然——所以你最终会同时拥有两者,但只有一个能正常工作。此外,conda 不支持 pip 实现的额外依赖项(dev 依赖项)。

要卸载可编辑的 conda 版本,你必须使用:

cd ~/github/fastai
conda develop -u .

在 Jupyter 中切换 Conda 环境

除了通过重启来正常切换环境:

source activate env1
jupyter notebook
(Ctrl-C 终止 jupyter)
source activate env2
jupyter notebook

你可以安装 nb_conda_kernels,它为每个 conda 环境提供了一个独立的 jupyter 内核,并附带了适当的代码来处理它们的设置。这使得切换 conda 环境就像切换 jupyter 内核一样简单(例如,从内核菜单中)。而且你不必担心从哪个环境启动了 jupyter notebook——只需从笔记本中选择正确的环境即可。

一些有用的单行命令

如何在 git 仓库中使用 CLI 安全高效地搜索/替换文件。操作不得触及 .git 下的任何内容:

find . -type d -name ".git" -prune -o -type f -exec perl -pi -e 's|OLDSTR|NEWSTR|g' {} \;

但它会 touch(1) 所有文件,这会减慢 git 端的速度,所以我们只想对实际包含旧模式的文件进行操作:

grep --exclude-dir=.git -lIr "OLDSTR" . | xargs -n1 perl -pi -e 's|OLDSTR|NEWSTR|g'