-e
或--editable
选项何时对pip install
有用?
对于某些项目,requirements.txt中的最后一行是-e .
。它到底做了什么?
答案 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.
因此,在尝试在本地安装软件包时会使用此方法,最常见的情况是在系统上进行开发时。它只是将包链接到原始位置,基本上意味着对原始包的任何更改都会直接反映在您的环境中。
答案 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搜索一个包时,它也会检查这个目录=>对这个目录中文件的任何更改都会立即反映出来。