开发者笔记
开发可编辑安装
要进行可编辑安装,请在克隆的 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 会自动加载这些文件到 conda
的 fastai
环境内运行的程序中。
你可以看到 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'