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


Answers:


81

如手册页所述:

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

因此,当您尝试在本地安装软件包时,通常会在系统上进行开发时使用此软件包。它将链接软件包到原始位置,基本上意味着对原始软件包的任何更改都将直接反映在您的环境中。

这里这里的一些掘金都一样。


27
仍然很难理解。当然,我阅读了--help页面。但这没有帮助。可以说我刚刚克隆了一个名为“ abc”的存储库。然后我安装了包含以下内容的requirements.txt -e .。它将使setup.py中的某些程序包在站点程序包中可编辑吗?抱歉,可能需要一个例子。
激怒

10
@Raituha Hmm我想文档对此可能会更详细
mu无

您能否举个例子:对原始软件包的任何更改都将直接反映在您的环境中
变量

6
@variable:如果您使用-e选项(pip install -e mypackage)安装本地项目并在您的环境中使用它(例如,在其他项目中,例如from mypackage import custom_function),那么当您对进行任何更改时custom_function,您将能够使用此更新版本而无需重新安装它再次(使用pip installpython setup.py),这会在省略-e标志的情况下发生。
Nerxis

1
@raitisd:运行时pip install -r requirements.txt,它将安装所有必需的软件包,然后(如果有的话-e .)应以开发模式安装当前软件包(例如,您在mypackage文件夹中并且等效于运行pip install -e .,因此任何更改都mypackage将直接反映在您的环境中)。没有其他软件包可以触及到此。
Nerxis

5

“开发”模式工作

尽管不是必需的,但在进行项目处理时,通常以“可编辑”或“开发”模式在本地安装项目。这使您的项目既可以安装也可以项目形式编辑。

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

pip install -e .

尽管有点神秘,但是-e的缩写 --editable,并且.是指当前工作目录,因此,总的来说,这意味着以可编辑模式安装当前目录(即您的项目)。

有关“开发模式”中setuptools和distutils内部的一些其他见解:

在正常情况下,distutils假设您将要构建项目的发行版,而不是以其“原始”或“未构建”的形式使用它。如果要使用distutils这种方式,则在开发期间每次对其进行更改时,都必须重新构建并重新安装项目。

有时会带来的另一个问题distutils是,您可能需要同时在两个相关项目上进行开发。您可能需要将两个项目的程序包放在同一目录中以运行它们,但是出于版本控制的目的,需要将它们分开。你该怎么做?

Setuptools允许您部署项目以在公共目录或暂存区域中使用,但无需复制任何文件。因此,您可以在每个项目的签出目录中编辑它们的代码,并且仅在更改项目的C扩展名或类似编译的文件时才需要运行构建命令。如果这是您的首选工作方式,则您甚至可以将一个项目部署到另一个项目的签出目录中(与使用公用的独立暂存区或site-packages目录相对)。

为此,请使用setup.py develop命令。它的工作原理与相似setup.py install,但实际上并没有安装任何东西。而是.egg-link在部署目录中创建一个特殊文件,该文件链接到项目的源代码。而且,如果您的部署目录是Python的site-packages目录,它还将更新easy-install.pth文件以包含项目的源代码,从而使sys.path使用该Python安装的所有程序都可以使用它。


编辑模式,可编辑模式,开发模式和开发模式是否都相同?
凯尔·德莱尼

2

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


有趣的是,使用--editable进行安装本质上是不可逆的吗?那是否意味着我们需要简单地放弃环境呢?
information_interchange

4
应当指出,从最新版本的pip开始,这不再是正确的。请参阅下面的堆栈溢出的答案评论:stackoverflow.com/questions/17346619/...

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=on提供的脚本)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可执行文件可以这样做(或者可能是自己的自定义测试)只是在与它相同的目录中正确找到了该软件包。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.