使用pip将Python包安装到不同的目录中?

Install a Python package into a different directory using pip?

我知道显而易见的答案是使用virtualenv和virtualenvwrapper,但出于各种原因,我不能/不想这样做。

那么如何修改命令

1
pip install package_name

要让pip在默认site-packages以外的其他地方安装包?


目标开关就是你要找的东西:

1
pip install --target=d:\somewhere\other\than\the\default package_name

但您仍然需要将d:\somewhere\other\than\the\default添加到PYTHONPATH中,以便从该位置实际使用它们。

如果目标交换机不可用,请升级pip:

在Linux或OS X上:

1
pip install -U pip

在Windows上(这解决了一个问题):

1
python -m pip install -U pip


用途:

1
pip install --install-option="--prefix=$PREFIX_PATH" package_name

您可能还希望使用--ignore-installed强制使用此新前缀重新安装所有依赖项。您可以多次使用--install-option来添加您可以与python setup.py install一起使用的任何选项(--prefix可能是您想要的,但是您可以使用更多的选项)。


除了--target选项或--install-options选项,我发现以下选项工作得很好(从https://github.com/pypa/pip/issues/446上关于这个问题的bug讨论中可以看出):

1
PYTHONUSERBASE=/path/to/install/to pip install --user

(或者在运行命令之前,使用export PYTHONUSERBASE=/path/to/install/to在您的环境中设置PYTHONUSERBASE目录)

这使用了非常有用的--user选项,但告诉它将binlibshare和其他目录设置为自定义前缀,而不是$HOME/.local

然后,您可以将它添加到您的PATHPYTHONPATH和其他变量中,就像添加一个普通的安装目录一样。

注意,如果需要在PYTHONUSERBASE目录中安装更新版本的包,您可能还需要指定--upgrade--ignore-installed选项,以覆盖系统提供的版本。

一个完整的例子:

1
PYTHONUSERBASE=/opt/mysterypackage-1.0/python-deps pip install --user --upgrade numpy scipy

..要将scipynumpy包的最新版本安装到一个目录中,然后您可以像这样包含在PYTHONPATH中(本例中使用bash和针对centos 6上的python 2.6):

1
2
export PYTHONPATH=/opt/mysterypackage-1.0/python-deps/lib64/python2.6/site-packages:$PYTHONPATH
export PATH=/opt/mysterypackage-1.0/python-deps/bin:$PATH

使用virtualenv仍然是一个更好、更整洁的解决方案!


安装python包通常只包含一些纯python文件。如果包中包含数据、脚本和或可执行文件,则这些文件将安装在与纯Python文件不同的目录中。

假设您的包没有数据/脚本/可执行文件,并且希望您的python文件进入/python/packages/package_name(而不是像使用--prefix时那样,位于/python/packages以下几个级别的子目录),那么您可以使用一次性命令:

1
pip install --install-option="--install-purelib=/python/packages" package_name

如果您希望所有(或大部分)软件包都能访问,可以编辑您的~/.pip/pip.conf以包括:

1
2
[install]
install-option=--install-purelib=/python/packages

这样你就不会忘记一次又一次地指定它。

除非您指定附加安装选项(--prefix/--install-data/--install-scripts等,有关详细信息,请查看自定义安装选项),否则包中包含的任何可删减项/数据/脚本仍将转到其默认位置。


为了精确地在我想要的地方安装一个库,我导航到我想要的位置,然后使用终端目录。

1
pip install mylibraryName -t .

我从这个页面上得到的逻辑是:https://cloud.google.com/appengine/docs/python/googlecloudstorageclient/download


似乎没有人提到-t选项,但最简单的是:

1
pip install -t <direct directory> <package>


只需在@ian bicking的回答中加上一点:

如果要在远程服务器上的主目录(没有sudo用户权限)中安装一些python包,使用--user选项指定已安装的目录也可以工作。

例如。,

1
pip install --user python-memcached

该命令将把包安装到pythonpath中列出的某个目录中。


更新版本的pip(8或更高版本)可以直接使用--prefix选项:

1
pip install --prefix=$PREFIX_PATH package_name

其中,$PREFIX_PATH是放置lib、bin和其他顶级文件夹的安装前缀。


1
pip install packageName -t pathOfDirectory

黄金

ZZU1


使用python3.5和pip 9.0.3测试这些选项:

pip install--目标/myfolder[包]

安装所有包,包括/myfolder下的依赖项。不考虑依赖包已经安装在python的其他地方。您可以在/myfolder/[包名称]中找到包。如果您有多个python版本,这不会考虑到这一点(包文件夹名中没有python版本)。

pip install--前缀/myfolder[包]

检查是否已安装依赖项。将包安装到/myfolder/lib/python3.5/site packages/[包]

pip install--根/myfolder[包]

检查依赖项,如--prefix,但安装位置将是/myfolder/usr/local/lib/python3.5/site packages/[package_name]。

pip install--用户[软件包]

将在$home中安装程序包:/主页/[用户]/.local/lib/python3.5/site-packagespython会自动从这个.local路径中搜索,这样就不需要将其放到pythonpath中。

=>在大多数情况下——用户是最好的选择。如果由于某种原因不能使用主文件夹,那么--prefix。


另外还有一个很好的建议,我在安装ipython时遇到了一个问题,当时我没有对/usr/local的写权限。

pip使用distuils进行安装,这个线程讨论了如何在依赖于sys.prefix设置时引起问题。

当ipython安装试图写入"/usr/local/share/man/man1",但权限被拒绝时,出现了我的问题。由于安装失败,它似乎没有在bin目录中写入ipython文件。

使用"--user"工作,文件被写入~/.local。在$path中添加~/.local/bin意味着我可以从那里使用"ipython"。

然而,我正试图为许多用户安装这个程序,并被授予了/usr/local/lib/python2.7目录的写许可。我在下面创建了一个"bin"目录,并为distutils设置指令:

1
2
3
4
5
vim ~/.pydistutils.cfg

[install]
install-data=/usr/local/lib/python2.7
install-scripts=/usr/local/lib/python2.7/bin

然后(使用-I强制安装,尽管以前有故障/本地安装):

1
pip install -I ipython

然后我把/usr/local/lib/python2.7/bin加到$PATH上。

我想我会把这个包括进来,以防其他人在他们没有sudo访问权限的机器上有类似的问题。


pip install /path/to/package/

现在有可能了。

与此不同的是,使用-e--editableFlag is that -elinks to where the package is saved(I.E.Your downloads folder),rather than installing it into your python path.

这意味着如果你删除/移动包装到另一个折页,你就无法使用它。


不幸的是,如果您将BREW与Python结合使用,那么PIP/PIP3提供的选项非常有限。您没有如上所述的--install选项、--target、--user选项。

Note on pip install --user
The normal pip install --user is disabled for brewed Python. This is because of a bug in distutils, because Homebrew writes a distutils.cfg which sets the package prefix.
A possible workaround (which puts executable scripts in ~/Library/Python/./bin) is:

python -m pip install --user --install-option="--prefix="

你可能会觉得这条线很麻烦。我建议使用pyenv进行管理。如果您正在使用

brew upgrade python python3

具有讽刺意味的是,您实际上降低了PIP功能。

(我发布这个答案,仅仅是因为我的macosx中的pip没有--target选项,而且我花了几个小时来修复它)


我建议遵循文档并创建~/.pip/pip.conf文件。注意:文档中缺少指定的头目录,这导致以下错误:

1
error: install-base or install-platbase supplied, but installation scheme is incomplete

conf文件的完整工作内容是:

1
2
3
4
5
6
7
[install]
install-base=$HOME
install-purelib=python/lib
install-platlib=python/lib.$PLAT
install-scripts=python/scripts
install-headers=python/include
install-data=python/data

不幸的是,我可以安装,但当尝试卸载pip时,它告诉我卸载过程中没有这样的包……所以仍然有问题,但包会转到它的预定义位置。


对于python EDOCX1(gnu/linux)上的pip v1.5.6,选项--root允许指定全局安装前缀(显然),而不考虑特定包的选项。试试F.I.

1
$ pip install --root=/alternative/prefix/path package_name