在何时-e
,或--editable
选择与有用pip install
?
对于某些项目,requirements.txt中的最后一行是-e .
。它到底是做什么的?
Answers:
-e .
。它将使setup.py中的某些程序包在站点程序包中可编辑吗?抱歉,可能需要一个例子。
-e
选项(pip install -e mypackage
)安装本地项目并在您的环境中使用它(例如,在其他项目中,例如from mypackage import custom_function
),那么当您对进行任何更改时custom_function
,您将能够使用此更新版本而无需重新安装它再次(使用pip install
或python setup.py
),这会在省略-e
标志的情况下发生。
pip install -r requirements.txt
,它将安装所有必需的软件包,然后(如果有的话-e .
)应以开发模式安装当前软件包(例如,您在mypackage
文件夹中并且等效于运行pip install -e .
,因此任何更改都mypackage
将直接反映在您的环境中)。没有其他软件包可以触及到此。
从“开发”模式工作:
尽管不是必需的,但在进行项目处理时,通常以“可编辑”或“开发”模式在本地安装项目。这使您的项目既可以安装也可以项目形式编辑。
假设您位于项目目录的根目录中,然后运行:
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安装的所有程序都可以使用它。
这是要注意重要的是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
在开发中使用的具体示例
如果我像下面这样玩这个测试包:
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
可执行文件可以这样做(或者可能是自己的自定义测试)只是在与它相同的目录中正确找到了该软件包。
pip install -e
运行setup.py develop
。