-e, --editable 选项什么时候对 pip 安装有用



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

对于某些项目,需求.txt的最后一行是-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所在位置的完整路径。

在开发中使用--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=提供的vcdcat脚本 setup.py ,不会符号链接,只是复制到:

~/.local/bin/vcdcat

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

相比之下,从 git 源安装常规的非--editable

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(或者可能是您自己的自定义测试)只是在它所在的同一目录中正确找到包。

在"开发"模式下工作:

尽管不是必需的,但通常在本地安装项目。 "可编辑"或"开发"模式,同时进行工作。这允许 您的项目既可以安装又可以在项目形式中编辑。

假设您位于项目目录的根目录中,然后运行:

pip install -e .

虽然有些神秘,但-e--editable.指的是当前工作目录,所以合在一起,它意味着安装当前目录(即你的 项目)处于可编辑模式。

从"开发模式"中对设置工具和发行版的内部的一些其他见解:

在正常情况下,distutils假设您将要 构建项目的发行版,而不是在其"原始"或 "未构建"形式。如果您以这种方式使用distutils,您将 每次进行 在开发过程中更改为它。

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

安装工具允许您部署项目以在公共中使用 目录或暂存区域,但不复制任何文件。因此,您 可以在其签出目录中编辑每个项目的代码,并且只需要 在更改项目的 C 扩展时运行生成命令,或 类似编译的文件。您甚至可以将一个项目部署到另一个项目中 项目的签出目录(如果这是您首选的工作方式) (与使用公共的独立暂存区或 站点包目录)。

为此,请使用 setup.py develop 命令。它的工作原理非常相似 setup.py install ,除了它实际上没有安装任何东西。 相反,它会在部署中创建特殊的.egg-link文件 目录,链接到项目的源代码。而且,如果你的 部署目录是 Python 的site-packages目录,它也会 更新easy-install.pth文件以包含项目的源代码 代码,从而使其在sys.path上可用于所有程序使用 那个蟒蛇安装。

重要的是要注意,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% 清理所有内容;即使在完成此操作后,导入(已删除!)本地库也可能成功,并且尝试从远程服务器安装相同版本可能无法执行任何操作(因为它认为您的(已删除!)本地版本已经是最新的)。

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

这很有用的主要原因是因为它使您的开发不必为来自本地来源的所有重复的 pip 安装而烦恼。

假设您必须修复一个需要将 API 更改为三个包的错误。您编辑其中一个,pip 在本地安装它,在对第一个的新更改上测试另一个,编辑第二个并同样在本地安装它并转到编辑第三个包,发现它在两次编辑之间中断,您需要返回并再次编辑第一个,pip 安装等。这是很多开发摩擦,不得不为所有这些中间的pip安装步骤而烦恼。

在这种类型的多包依赖包开发中,更可取的是将它们全部安装在可编辑模式下。然后,您可以自由编辑、进行更改和测试,而无需进行中间 pip 安装即可使包从您的最新草稿中工作。您从源代码进行前期可编辑安装,进行黑客攻击和测试,当一切都得到证明时,您可以将更改提交到所有软件包并为所有软件包发布并行版本。

另一个原因是它有助于 IDE 中的代码导航,您始终希望导航到存储库中的依赖项包,尤其是 monorepo,其中有多个包。您可以在配置中枚举许多包含文件夹,以便 IDE 知道包可以驻留的许多位置,或者在 IDE 中选择的解释器可以将可编辑安装设置为存储库的克隆,并且同样能够导航到文件夹,尤其是在这些包文件夹在其 setup.py 逻辑中执行别名时。

最新更新