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

rai*_*isd 36 python pip

该选项-e--editable选项何时有用pip install

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

mu *_*u 無 36

正如手册页所说:

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

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

有些金块在这里这里相同.

  • @variable:如果您使用“-e”选项(“pip install -e mypackage”)安装本地项目并在您的环境中使用它(例如在其他项目中,如“from mypackage import custom_function”),那么,当您进行任何操作时更改为您的“custom_function”,您将能够使用此更新版本而无需再次重新安装(使用“pip install”或“python setup.py”),这在省略“-e”标志的情况下会发生。 (11认同)
  • 它仍然很难理解.当然我读了--help页面.但它没有帮助.让我们说我刚刚克隆了一个名为'abc'的回购.我安装了包含`-e .`的requirements.txt.它会使setup.py中的某些包在site-packages中可编辑吗?对不起,可能需要一个例子. (6认同)
  • @Raituha嗯,我想文档可能会有点冗长 (6认同)
  • @raitisd:当您运行“pip install -rrequirements.txt”时,它将安装所有必需的软件包,然后(如果有“-e”)它应该在开发模式下安装当前软件包(例如,您在“mypackage”中文件夹,它相当于运行“pip install -e .”,因此“mypackage”中的任何更改都会直接反映在您的环境中)。没有其他包受此影响。 (2认同)

Cir*_*四事件 20

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

如果您使用此测试包,如下所示:

cd ~
git clone https://github.com/cirosantilli/vcdvcd
cd vcdvcd
git checkout 5dd4205c37ed0244ecaf443d8106fadb2f9cfbb8
python -m pip install --editable . --user
Run Code Online (Sandbox Code Playgroud)

它输出:

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
Run Code Online (Sandbox Code Playgroud)

Can't uninstall 'vcdvcd'是正常的:它试图卸载任何现有的vcdvcd,然后用以下步骤中产生的“类似符号链接的机制”替换它们,但由于没有以前的安装而失败。

然后它生成一个文件:

~/.local/lib/python3.8/site-packages/vcdvcd.egg-link
Run Code Online (Sandbox Code Playgroud)

其中包含:

/home/ciro/vcdvcd
.
Run Code Online (Sandbox Code Playgroud)

并充当 Python 解释器的“符号链接”。

所以现在,如果我对 下的 git 源代码进行任何更改/home/ciro/vcdvcd,它会自动反映在可以从任何目录执行以下操作的导入程序上:

python -c 'import vcdvcd'
Run Code Online (Sandbox Code Playgroud)

但是请注意pip,至少在我的版本中,使用 安装的二进制文件--editable,例如vcdcat该包通过scripts=on提供的脚本setup.py,不会获得符号链接,只是复制到:

~/.local/bin/vcdcat
Run Code Online (Sandbox Code Playgroud)

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

相比之下,--editable来自 git 源的常规非安装:

python -m pip uninstall vcdvcd
python -m pip install --user .
Run Code Online (Sandbox Code Playgroud)

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

~/.local/lib/python3.8/site-packages/vcdvcd
Run Code Online (Sandbox Code Playgroud)

如上所述卸载可编辑包需要足够新的 pip,如下所述:如何使用 pip 卸载可编辑包(使用 -e 安装)

在 Python 3.8、pip 20.0.2、Ubuntu 20.04 中测试。

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

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

但是,如果您可以在树中完全测试您的更改,只需这样做,而不是生成更复杂的可编辑安装。

例如,上面的 vcdvcd 包是以一种方式设置的,您可以直接cd进入源代码,./vcdcat而无需 pip 安装包本身(通常,您可能需要从中安装依赖项requirements.txt),以及该import vcdvcd可执行文件所做的(或者可能是您的自己的自定义测试)只是在它所在的同一目录中正确找到包。

  • “然后它生成一个文件:~/.local/lib/python3.8/site-packages/vcdvcd.egg-link [...]并充当Python解释器的“符号链接”。” ---这正是我想要的,谢谢! (2认同)

Chr*_*raf 7

在“开发”模式下工作

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

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

pip install -e .

虽然有点神秘,它-e是 , 的缩写 --editable.指的是当前工作目录,所以放在一起,意味着以可编辑模式安装当前目录(即您的项目)。

“开发模式”中对 setuptools 和 distutils 内部的一些额外见解:

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

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

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

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


小智 5

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

  • 应该注意的是,从最新版本的 pip 开始,情况不再如此。请参阅以下堆栈溢出答案评论:/sf/ask/1214263361/#comment103350606_17346619 (6认同)