什么时候-e, - edit选项对pip install有用吗?

时间:2016-01-28 14:40:40

标签: python pip

-e--editable选项何时对pip install有用?

对于某些项目,requirements.txt中的最后一行是-e .。它到底做了什么?

5 个答案:

答案 0 :(得分:23)

正如手册页所说:

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

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

围绕同一herehere的一些小块。

答案 1 :(得分:5)

来自Working in "development" mode

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

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

pip install -e .

-e虽然有点神秘, --editable.指的是当前工作目录,因此,这意味着要安装当前目录(即您的 项目)。

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

答案 3 :(得分:1)

在开发中使用--editable的具体示例

如果我像这样玩this test package

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的二进制文件,例如该软件包通过{{1}上的vcdcat提供的scripts=脚本}},不要进行符号链接,只需将其复制到:

setup.py

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

通过比较,从git源进行常规的非~/.local/bin/vcdcat 安装:

--editable

在以下位置生成已安装文件的副本:

python -m pip uninstall vcdvcd
python -m pip install --user .

如上文所述,要卸载可编辑程序包,需要一个足够新的点,如How to uninstall editable packages with pip (installed with -e)

所述

在Python 3.8,pip 20.0.2,Ubuntu 20.04中进行了测试。

建议:尽可能直接在树内开发

当您通过另一个项目测试对程序包的修补程序时,可编辑的设置非常有用。

但是,如果您可以完全测试树中的更改,则只需执行此操作,而不是生成更复杂的可编辑安装即​​可。

例如,上述vcdvcd软件包的设置方式是,您可以~/.local/lib/python3.8/site-packages/vcdvcd 进入源代码并执行cd而无需pip安装软件包本身(通常,您可能需要从./vcdcat,然后该可执行文件执行的requirements.txt(或可能是您自己的自定义测试)只是在与它相同的目录中正确找到了包。

答案 4 :(得分:0)

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