将pip软件包安装到$HOME文件夹

333

有可能吗?在安装 pip 时,将python包安装在我的$HOME文件夹内(例如,我想使用pip 安装 mercurial,但是安装在$HOME文件夹内而不是/usr/local)。

我使用的是Mac电脑,想到了这个可能性,可以使用$HOME来避免“污染”我的/usr/local

PEP370 就是关于这个的。只需创建一个˜/.local 然后执行 pip install package 命令是否足以使这些软件包仅安装在我的$HOME文件夹中?


你有没有尝试过virtualenv?你可以在一个隔离的环境中使用pip安装包。 - joet3ch
2
我考虑过这个问题,但我想使用现有的Python(2.6.1)安装一些Python应用程序,而不是安装在/usr/local/上,而是安装在我的$HOME文件夹中,并将其添加到$PATH。我想知道是否可能以及此方法的任何注意事项。 - Somebody still uses you MS-DOS
11
支持推广 PEP370。这是一个简单但有用的选项,更多人应该了解它。 - Ned Deily
1
如果您需要安装PIP,只需执行类似于“wget https://bootstrap.pypa.io/get-pip.py”的操作,然后执行“python get-pip.py”,就可以开始使用了。如果您的机器上安装的PIP版本太旧(这是我的情况),这可能非常有用。有关更多信息,请参见http://pip.readthedocs.org/en/latest/installing.html。 - Markus
@JanVlcinsky,对我来说,在Python 3.5上,这个命令没有起作用。它是:python setup.py install --user - Akronix
显示剩余2条评论
4个回答

475

虽然您可以使用virtualenv,但并非必须。诀窍在于将PEP370的--user参数传递给setup.py脚本。使用最新版本的pip,一种方法是:

pip install --user mercurial
这将导致 hg 脚本被安装在 $HOME/.local/bin/hg 中,其余的 hg 包位于 $HOME/.local/lib/pythonx.y/site-packages/ 中。
值得注意的是,对于 Python 2.6 版本而言上述情况是正确的。Python 核心开发人员在 Mac OS X 上就 PEP370-风格的用户安装目录位置存在争议,具体可参考这里。在 Python 2.7 和 3.2 版本中,Mac OS X 上的位置已从 $HOME/.local 改变为$HOME/Library/Python。这可能会在未来版本中发生改变。但是,目前在 2.7(如果在 Python 3 上支持 hg)上,以上位置将是 $HOME/Library/Python/x.y/bin/hg$HOME/Library/Python/x.y/lib/python/site-packages

1
这看起来非常有趣。easy_install在Mac OS X中默认安装,所以我只需要在$HOME文件夹之外安装pip。 - Somebody still uses you MS-DOS
1
我已经尝试将 PYTHONUSERBASE 更改为另一个位置。但没有成功。在 Windows 上应该如何操作? - Snerd
2
请注意,如果您这样做,然后尝试使用conda环境,安装在.local中的文件将始终首先被调用,这可能会导致非常难以跟踪的导入错误。 - tacaswell
13
请注意,在Mac OS X系统上,用户站点目录(bin文件夹)不在PATH环境变量中。这意味着,在用户站点目录中安装的软件包所带的脚本无法执行,除非您运行命令export PATH=$PATH:~/Library/Python/X.Y/bin/ - André Caron
对于任何想知道的人,在Windows上,这将安装脚本到%APPDATA%\Python\Python36\Scripts。 - Somo S.
显示剩余6条评论

22
您可以指定-t选项(--target)来指定目标目录。有关详细信息,请参见pip install --help。这是您需要的命令:
pip install -t path_to_your_home package-name

例如,如果要在我的$HOME目录中安装mxnet,我会输入以下命令:
pip install -t /home/foivos/ mxnet

出现错误 distutils.errors.DistutilsOptionError: can't combine user with prefix, exec_prefix/home, or install_(plat)base。这是什么意思? - Anthony Kong
请查看 https://github.com/pypa/pip/issues/3826 以获取相关讨论。我对此一无所知,但在我的环境中从未遇到过问题。 - Foivos
1
我宁愿给出“-t /home/foivos/python_packages”作为示例,因为直接安装到主目录可能会导致大量文件“污染”$HOME。 - jifb

21

我会在你的HOME目录使用virtualenv。

$ sudo easy_install -U virtualenv
$ cd ~
$ virtualenv .
$ bin/pip ...

您还可以更改~/.(login|profile|bash_profile),根据您的shell选择正确的文件,将~/bin添加到您的PATH中,然后pip|python|easy_install将成为默认使用的工具。


9
“实际上”的做法是使用命令 virtualenv venv 来创建虚拟环境,然后使用命令 source venv/bin/activate 激活该虚拟环境。但您可能不希望始终使用虚拟环境,通过使用这种方法,当您使用虚拟环境时,提示符前缀会显示为“(venv)”。 - alexia
2
@nyuszika7h 我们知道如何使用virtualenv。但这确实回答了问题,是一个非常简洁的解决方案。 - itsafire
8
“我们”是谁?我建议你阅读 https://en.wikipedia.org/wiki/Weasel_word 。 - alexia
4
无论如何,我不同意,这不是一个“简洁的解决方案”。它只是一个毫无意义的hack。 - alexia

0

从其他答案中摘取的对你两个问题的简短回答

是的

可以将pip包安装到$HOME而不是/usr/local/lib/,但是

mkdir ˜/.local # then
pip install package 

还不够。

你需要

pip install package --user

而且软件包会被安装到

/home/user/.local/lib/python3.x/site-packages

当你不需要--user时出现异常

  • 如果您不是root用户
  • DebianWsl - Windows子系统Linux上,没有通知
  • 在Ubuntu 20.04上,注意默认使用用户安装,因为普通的site-packages不可写 - 默认配置是/usr/lib,除了root以外的其他用户无法写入

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接