什么时候-e或--editable选项对pip install有用?
-e
--editable
pip install
对于某些项目,requirements.txt中的最后一行是-e .。它到底是做什么的?
-e .
正如手册页所说:
-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所在位置的完整路径。
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 uninstall
pip install -e
sudo python3 -m setup.py install --record installed_files.txt
sudo rm -r /usr/local/lib/python3.7/dist-packages/tdc7201-0.1a2-py3.7.egg/
从以“开发”模式工作:
虽然不是必需的,但在本地安装项目是很常见的 “可编辑”或“开发”模式。这允许 .你的项目将以项目形式安装和编辑 假设你在项目目录的根目录下,然后运行: 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上的所有程序使用
在正常情况下,distutils假设你将要 构建项目的发行版,而不是以“原始”或“原始”方式使用它 “破坏”的形式。如果你以这种方式使用distutils,你会 每次你犯错误都要重新构建和重新安装你的项目
distutils
Setuptools允许你部署你的项目在公共环境中使用 目录或暂存区,但不复制任何文件。因此,您 可以编辑每个项目的代码在其签出目录,只需要 当您更改项目的C扩展或时运行构建命令 类似的编译文件。您甚至可以将一个项目部署到另一个项目中 项目的签出目录,如果这是您喜欢的工作方式 (而不是使用公共的独立暂存区或 网站目录)。< / p > 要做到这一点,使用setup.py develop命令。原理非常相似 setup.py install,除了它实际上没有安装任何东西。 相反,它在部署中创建了一个特殊的.egg-link文件 目录,它链接到项目的源代码。如果你 部署目录是Python的site-packages目录,它也将 更新easy-install.pth文件以包含项目的源代码 代码,从而使它可用于sys.path上的所有程序使用
setup.py develop
setup.py install
.egg-link
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,然后用“类符号链接机制”替换它们。在以下步骤中生成,但失败了,因为之前没有安装。
Can't uninstall 'vcdvcd'
vcdvcd
然后生成一个文件:
~/.local/lib/python3.8/site-packages/vcdvcd.egg-link
它包含:
/home/ciro/vcdvcd .
并充当“符号链接”;到Python解释器。
所以现在,如果我在/home/ciro/vcdvcd下对git源代码做任何更改,它会自动反映到可以从任何目录执行以下操作的导入器:
/home/ciro/vcdvcd
python -c 'import vcdvcd'
但是请注意,至少在我的pip版本中,使用--editable安装的二进制文件,例如该包通过scripts=在setup.py上提供的vcdcat脚本,不会得到符号链接,只是复制到:
pip
scripts=
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(或者可能是你自己的自定义测试)只是在它所在的同一目录中正确地找到包。
cd
./vcdcat
requirements.txt
import vcdvcd
正如在前面的回答中所建议的,没有正在创建的符号链接。 “-e”选项是如何工作的?→它只是更新文件“PYTHONDIR/site-packages/easy-install.pth”;使用'命令PIP install -e'中指定的项目路径。 所以每次python搜索一个包时,它也会检查这个目录=>对该目录下文件的任何更改都会立即反映出来