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...

问题描述:

何时使用-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是为该包的开发者准备的。普通用户永远不需要它!

使用-eof 时--editable,包不会像典型包那样安装;而是在 (例如) 中复制.../site-packages。相反,只有一些管理文件放在那里。它们指示 Python 读取原始“源”位置中的文件。

因此,当编辑这些时,它们会被直接使用——无需重新安装!对于软件包开发人员来说非常方便;对于普通用户来说可能风险太大——因为更改/删除文件会立即生效

相关推荐
  政府信创国产化的10大政策解读一、信创国产化的背景与意义信创国产化,即信息技术应用创新国产化,是当前中国信息技术领域的一个重要发展方向。其核心在于通过自主研发和创新,实现信息技术应用的自主可控,减少对外部技术的依赖,并规避潜在的技术制裁和风险。随着全球信息技术竞争的加剧,以及某些国家对中国在科技领域的打压,信创国产化显...
工程项目管理   3970  
  为什么项目管理通常仍然耗时且低效?您是否还在反复更新电子表格、淹没在便利贴中并参加每周更新会议?这确实是耗费时间和精力。借助软件工具的帮助,您可以一目了然地全面了解您的项目。如今,国内外有足够多优秀的项目管理软件可以帮助您掌控每个项目。什么是项目管理软件?项目管理软件是广泛行业用于项目规划、资源分配和调度的软件。它使项...
项目管理软件   2740  
  本文介绍了以下10款项目管理软件工具:禅道项目管理软件、Freshdesk、ClickUp、nTask、Hubstaff、Plutio、Productive、Targa、Bonsai、Wrike。在当今快速变化的商业环境中,项目管理已成为企业成功的关键因素之一。然而,许多企业在项目管理过程中面临着诸多痛点,如任务分配不...
项目管理系统   79  
  本文介绍了以下10款项目管理软件工具:禅道项目管理软件、Monday、TeamGantt、Filestage、Chanty、Visor、Smartsheet、Productive、Quire、Planview。在当今快速变化的商业环境中,项目管理已成为企业成功的关键因素之一。然而,许多项目经理和团队在管理复杂项目时,常...
开源项目管理工具   87  
  本文介绍了以下10款项目管理软件工具:禅道项目管理软件、Smartsheet、GanttPRO、Backlog、Visor、ResourceGuru、Productive、Xebrio、Hive、Quire。在当今快节奏的商业环境中,项目管理已成为企业成功的关键因素之一。然而,许多企业在选择项目管理工具时常常面临困惑:...
项目管理系统   74  
热门文章
项目管理软件有哪些?
曾咪二维码

扫码咨询,免费领取项目管理大礼包!

云禅道AD
禅道项目管理软件

云端的项目管理软件

尊享禅道项目软件收费版功能

无需维护,随时随地协同办公

内置subversion和git源码管理

每天备份,随时转为私有部署

免费试用