Pip(python)中`--install-option='--prefix'`与`--root`和`--target`的区别
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 个回答
首先,最明显的问题是:为什么不直接从 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
文件的目录(就是你解压文件的地方)。
接下来回答其他问题:
--root <dir>
是用来改变pip
安装包资源的根目录,而不是用来改变查找包的位置。--target
是用来告诉pip
应该把包安装到哪个文件夹。--install-option
是用来设置一些变量,这些变量会被setup.py
使用,而不是用来改变pip
查找文件的位置。