-e,——editable选项在pip install中什么时候有用?

什么时候-e--editable选项对pip install有用?

对于某些项目,requirements.txt中的最后一行是-e .。它到底是做什么的?

115589 次浏览

正如手册页所说:

-e,--editable <path/url>
Install a project in editable mode (i.e.  setuptools "develop mode") from a local project path or a VCS url.

所以当你试图在本地安装一个包时,你会使用这个,最常见的情况是当你在你的系统上开发它时。它只会将包链接到原始位置,基本上意味着对原始包的任何更改都将直接反映在您的环境中。

一些掘金围绕相同的在这里在这里

运行的示例可以是:

pip install -e .

pip install -e ~/ultimate-utils/ultimate-utils-proj-src/

注意第二个是setup.py所在位置的完整路径。

值得注意的是,pip uninstall 可以 卸载是与pip install -e一起安装的模块。所以如果你走这条路,准备好事情变得非常混乱,如果你需要卸载。部分的解决方案是(1)重新安装,保存创建的文件的记录,如sudo python3 -m setup.py install --record installed_files.txt,然后(2)手动删除列出的所有文件,如sudo rm -r /usr/local/lib/python3.7/dist-packages/tdc7201-0.1a2-py3.7.egg/(用于模块tdc7201的0.1a2版本)。然而,这并不能100%地清理一切;即使在您完成了这些操作之后,导入(已删除的!)本地库可能会成功,并且试图从远程服务器安装相同的版本可能会失败(因为它认为您的(已删除的!)本地版本已经是最新的)。

以“开发”模式工作:

虽然不是必需的,但在本地安装项目是很常见的 “可编辑”或“开发”模式。这允许

.你的项目将以项目形式安装和编辑

假设你在项目目录的根目录下,然后运行:

pip install -e .

虽然有点神秘,-e是缩写 --editable.指的是当前的工作目录,所以它们一起意味着安装当前目录(即你的目录)

.项目)在可编辑模式

一些来自“发展模式”的setuptools和distutils内部的额外见解:

在正常情况下,distutils假设你将要 构建项目的发行版,而不是以“原始”或“原始”方式使用它 “破坏”的形式。如果你以这种方式使用distutils,你会 每次你犯错误都要重新构建和重新安装你的项目

distutils有时会出现的另一个问题是你 可能需要同时开发两个相关的项目。 您可能需要将两个项目的包放在同一个目录中 运行它们,但需要将它们分开以进行修订控制 目的。你怎么能这样做呢?< / p >

Setuptools允许你部署你的项目在公共环境中使用 目录或暂存区,但不复制任何文件。因此,您 可以编辑每个项目的代码在其签出目录,只需要 当您更改项目的C扩展或时运行构建命令 类似的编译文件。您甚至可以将一个项目部署到另一个项目中 项目的签出目录,如果这是您喜欢的工作方式 (而不是使用公共的独立暂存区或 网站目录)。< / p > 要做到这一点,使用setup.py develop命令。原理非常相似 setup.py install,除了它实际上没有安装任何东西。 相反,它在部署中创建了一个特殊的.egg-link文件 目录,它链接到项目的源代码。如果你 部署目录是Python的site-packages目录,它也将 更新easy-install.pth文件以包含项目的源代码 代码,从而使它可用于sys.path上的所有程序使用

在开发中使用--editable的具体例子

如果使用这个测试包,如下所示:

cd ~
git clone https://github.com/cirosantilli/vcdvcd
cd vcdvcd
git checkout 5dd4205c37ed0244ecaf443d8106fadb2f9cfbb8
python -m pip install --editable . --user

输出:

Obtaining file:///home/ciro/bak/git/vcdvcd
Installing collected packages: vcdvcd
Attempting uninstall: vcdvcd
Found existing installation: vcdvcd 1.0.6
Can't uninstall 'vcdvcd'. No files were found to uninstall.
Running setup.py develop for vcdvcd
Successfully installed vcdvcd-1.0.6

Can't uninstall 'vcdvcd'是正常的:它试图卸载任何现有的vcdvcd,然后用“类符号链接机制”替换它们。在以下步骤中生成,但失败了,因为之前没有安装。

然后生成一个文件:

~/.local/lib/python3.8/site-packages/vcdvcd.egg-link

它包含:

/home/ciro/vcdvcd
.

并充当“符号链接”;到Python解释器。

所以现在,如果我在/home/ciro/vcdvcd下对git源代码做任何更改,它会自动反映到可以从任何目录执行以下操作的导入器:

python -c 'import vcdvcd'

但是请注意,至少在我的pip版本中,使用--editable安装的二进制文件,例如该包通过scripts=setup.py上提供的vcdcat脚本,不会得到符号链接,只是复制到:

~/.local/bin/vcdcat

就像常规安装一样,因此对git存储库的更新不会直接影响它们。

相比之下,常规的非--editable安装来自git源代码:

python -m pip uninstall vcdvcd
python -m pip install --user .

在下面生成已安装文件的副本:

~/.local/lib/python3.8/site-packages/vcdvcd

如上所述,卸载可编辑包需要一个新的足够pip,如如何使用pip卸载可编辑包(使用-e安装)所述

在Python 3.8中测试,pip 20.0.2, Ubuntu 20.04。

建议:尽可能直接在树中开发

当您通过另一个项目测试包的补丁时,可编辑的设置非常有用。

但是,如果您可以完全测试您的变更树,那么就这样做,而不是生成一个更复杂的可编辑安装。

例如,上面的vcdvcd包的设置方式是,你可以将cd放入源代码,并执行./vcdcat,而无需pip安装包本身(通常,你可能需要从requirements.txt安装依赖项),而可执行文件所做的import vcdvcd(或者可能是你自己的自定义测试)只是在它所在的同一目录中正确地找到包。

正如在前面的回答中所建议的,没有正在创建的符号链接。 “-e”选项是如何工作的?→它只是更新文件“PYTHONDIR/site-packages/easy-install.pth”;使用'命令PIP install -e'中指定的项目路径。 所以每次python搜索一个包时,它也会检查这个目录=>对该目录下文件的任何更改都会立即反映出来