pip install 时 -e、--editable 选项何时有用?
- 2025-01-15 08:45:00
- admin 原创
- 167
问题描述:
何时使用-e
、 或--editable
选项会很有用pip install
?
对于某些项目,requirements.txt 中的最后一行是-e .
。它到底起什么作用?
解决方案 1:
正如手册页所述:
-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
。
解决方案 2:
--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 解释器的“符号链接”。
所以现在,如果我对 下的 git 源代码进行任何更改/home/ciro/vcdvcd
,它都会自动反映在可以从任何目录执行以下任务的导入者身上:
python -c 'import vcdvcd'
但请注意,pip
至少在我的版本中,使用 安装的二进制文件--editable
(例如vcdcat
该包通过 提供的脚本)scripts=
不会setup.py
被符号链接,而只是复制到:
~/.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
该可执行文件(或可能是您自己的自定义测试)只需在它所在的目录中正确找到该包。
解决方案 3:
从“开发”模式下工作:
虽然不是必需的,但在处理项目时,将项目安装到本地并设置为“可编辑”或“开发”模式是很常见的。这样,您的项目既可以以项目形式安装,也可以以项目形式编辑。
假设您位于项目目录的根目录中,然后运行:
pip install -e .
虽然有些神秘,但
-e
它是 的缩写
--editable
,.
指的是当前工作目录,因此合在一起意味着以可编辑模式安装当前目录(即您的项目)。
从“开发模式”中可以了解到 setuptools 和 distutils 内部的一些额外见解:
在正常情况下,我们
distutils
假设您要构建项目的发行版,而不是以“原始”或“未构建”的形式使用它。如果您以这种distutils
方式使用,则每次在开发过程中对项目进行更改时,您都必须重建并重新安装项目。有时会出现的另一个问题是
distutils
,您可能需要同时开发两个相关的项目。您可能需要将两个项目的包放在同一个目录中才能运行它们,但需要将它们分开以进行修订控制。您该怎么做呢?Setuptools 允许您将项目部署到公共目录或暂存区中,而无需复制任何文件。因此,您可以在每个项目的签出目录中编辑其代码,并且只有在更改项目的 C 扩展或类似编译的文件时才需要运行构建命令。您甚至可以将项目部署到另一个项目的签出目录中,如果这是您喜欢的工作方式(而不是使用公共独立暂存区或站点包目录)。
为此,请使用
setup.py develop
命令。它的工作原理与非常相似setup.py install
,只是它实际上不会安装任何东西。相反,它会.egg-link
在部署目录中创建一个特殊文件,该文件链接到项目的源代码。并且,如果您的部署目录是 Python 的site-packages
目录,它还会更新easy-install.pth
文件以包含项目的源代码,从而使sys.path
所有使用该 Python 安装的程序都可以使用它。
解决方案 4:
需要注意的是,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% 清理所有内容;即使在您完成此操作后,导入(已删除!)本地库可能会成功,而尝试从远程服务器安装相同版本可能会失败(因为它认为您的(已删除!)本地版本已经是最新的)。
解决方案 5:
正如前面的答案所建议的,没有创建任何符号链接。'-e' 选项如何工作?-> 它只是使用 '命令 pip install -e' 中指定的项目路径更新文件“PYTHONDIR/site-packages/easy-install.pth”。因此,每次 python 搜索包时,它也会检查此目录 => 此目录中文件的任何更改都会立即反映出来。
解决方案 6:
它很有用的主要原因是因为它使您的开发免于从本地源重复安装 pip。
想象一下,您必须修复一个错误,该错误需要更改三个软件包的 API。您编辑其中一个,在本地使用 pip 安装它,测试另一个对第一个软件包的新更改,编辑第二个软件包,同样在本地安装它,然后编辑第三个软件包,发现它在两次编辑之间出现问题,您需要返回并再次编辑第一个软件包,使用 pip 安装等等。这些中间的 pip 安装步骤会给开发带来很多麻烦。
在这种多软件包依赖包开发中,更理想的做法是将它们全部以可编辑模式安装。然后,您可以自由地编辑、更改和测试,而无需执行中间的 pip 安装来使软件包在最新草稿上运行。您可以从源代码进行前期可编辑安装,进行黑客攻击和测试,当一切都得到验证后,您可以将更改提交给所有软件包并为所有软件包发布并行版本。
另一个原因是它有助于 IDE 中的代码导航,您总是希望导航到存储库中的依赖项包,尤其是 monorepo,其中包含多个包。您可以在配置中枚举许多包含文件夹,以便 IDE 了解包可以驻留的许多位置,或者 IDE 中选择的解释器可以将可编辑安装设置为存储库的克隆,同样能够导航到文件夹,特别是当这些包文件夹在其 setup.py 逻辑中执行别名时。
解决方案 7:
很简单:--editable
是为该包的开发者准备的。普通用户永远不需要它!
使用-e
of 时--editable
,包不会像典型包那样安装;而是在 (例如) 中复制.../site-packages
。相反,只有一些管理文件放在那里。它们指示 Python 读取原始“源”位置中的文件。
因此,当编辑这些源时,它们会被直接使用——无需重新安装!对于软件包开发人员来说非常方便;对于普通用户来说可能风险太大——因为更改/删除文件会立即生效
扫码咨询,免费领取项目管理大礼包!