Pip(python)中`--install-option='--prefix'`与`--root`和`--target`的区别

43 投票
1 回答
29170 浏览
提问于 2025-04-18 17:27

pip的文档在处理源和目标参数方面,内容太少了(在我看来)。

我在用 pip3 安装 Sphinx 的时候遇到了一些奇怪的事情,尝试了各种选项,想要把它安装到我想要的具体位置(因为我想把每个东西放在自己的目录里)。我说“尝试”,并不是说我没看文档或者没用过 --help,而是因为 pip3 help install 并没有提供帮助,而 pip install 的官方文档在这方面也太简短了,实际上说的内容和 pip3 help install 没什么区别。

下面是我做的一些实验和观察。

第一个案例:使用 --root

下载了当前的 Sphinx 源代码包,解压后进入新创建的目录,然后执行了:

pip3 install --root /home/<user-name>/apps/sphinx -e .

我以为这和 --prefix 是一样的,因为没有明显可用的 --prefix 选项。没想到,它把命令安装到了 Python3 的 bin 目录(Python3 也在自己的目录中安装),还有一些东西放在它的库目录里,更奇怪的是,我本想要一个 /home/<user-name>/apps/sphinx 的目录,结果却得到了 /home/<user-name>/apps/sphinx/home/<user-name>/apps/sphinx/…:它把指定的路径加到了自己后面。

这最后一点到底有什么意义呢?--root 的目的是什么?

第二个案例:使用 --target

然后我想,如果不是 --root,那可能是 --target,所以我在清理后执行了:

pip3 install --target /home/<user-name>/apps/sphinx -e .  

结果不行,报错说 --home 选项不被识别。

这个 --home(我并没有指定)到底是什么,--target 又是什么呢?

第三个案例:使用 --install-option='--prefix=…'

经过一些网上搜索和在 StackOverflow 上的讨论,我尝试了这个:

pip3 install --install-option='--prefix=/home/<user-name>/apps/sphinx' -e .

结果它只是抱怨说无法安装 .pth 文件,提示我的 PYTHONPATH 有问题,重启后加上一个变量定义就能解决:

export PYTHONPATH=/home/<user-name>/apps/sphinx/lib/python3.4/site-packages
pip3 install --install-option='--prefix=/home/<user-name>/apps/sphinx' -e .

我甚至在目录实际存在和安装任何东西之前就得设置 PYTHONPATH,但这没问题(至于 pip 是否应该在过程中自动更新 PYTHONPATH 并提醒我设置,这个问题可以讨论)。

这个选项是正确的,但也是最不明显的。

另一个相关问题:

--editable--src 有什么区别?

更新 #1

我不确定这是否和 Sphinx 有关,但我注意到另外两件事。

执行

pip3 install --install-option='--prefix=<install-dir>' -e <repository-dir>

其中 repository-dir 是 Sphinx 的本地检出目录,Sphinx 被安装在 install-dir,在 pip3 list 中列出,但无法卸载。

相反,执行

pip3 install --install-option='--prefix=<install-dir>' Sphinx

也就是让 pip3 去获取一个归档文件,Sphinx 并没有安装在 install-dir,而是安装在 Python 目录中,能在 pip3 list 中列出,并且可以卸载。

根据源是本地仓库还是远程归档,安装位置会不同,是否可以卸载也会不同。

依赖关系没有受到影响,在两种情况下都以相同的方式处理(安装在预期位置,列出,并且可以卸载)。

更新 #2

使用 --root 的行为让我觉得像是某种假根(就像在构建 Debian 包或交叉编译时得到的那种)。如果这是预期的,那么让我感到惊讶的路径其实是可以预料的。

1 个回答

1

首先,最明显的问题是:为什么不直接从 PyPI 安装这个包呢?

sudo pip install sphinx

如果你想用 pip 安装任何有 setup.py 文件的东西,可以使用 --editable 这个选项:

-e, --editable <path/url>

以可编辑模式安装一个项目(也就是 setuptools 的“开发模式”),可以从本地项目路径或版本控制系统的 URL 安装。

所以你可以直接输入这个命令(如果需要的话,加上 sudo):

pip3 install -e /path/to/pkg

这里 /path/to/pkg 是你放置 setup.py 文件的目录(就是你解压文件的地方)。

接下来回答其他问题:

  1. --root <dir> 是用来改变 pip 安装包资源的根目录,而不是用来改变查找包的位置。

  2. --target 是用来告诉 pip 应该把包安装到哪个文件夹。

  3. --install-option 是用来设置一些变量,这些变量会被 setup.py 使用,而不是用来改变 pip 查找文件的位置。

撰写回答