528

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

那么如何修改命令

pip install package_name

pip软件包安装在默认位置以外的其他地方site-packages

4

17 回答 17

716

--target开关是您正在寻找的东西:

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

但是您仍然需要添加d:\somewhere\other\than\the\defaulttoPYTHONPATH才能从该位置实际使用它们。

-t, --target <dir>
将软件包安装到 <dir>。默认情况下,这不会替换 <dir> 中的现有文件/文件夹。
使用 --upgrade 将 <dir> 中的现有包替换为新版本。


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

在 Linux 或 OS X 上:

pip install -U pip

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

python -m pip install -U pip
于 2013-10-16T13:10:54.900 回答
361

采用:

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

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

于 2010-05-26T19:59:36.967 回答
87

而不是--targetor--install-options选项,我发现设置PYTHONUSERBASE环境变量效果很好(来自关于这个问题的错误的讨论):

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

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

这使用了非常有用的--user选项,但告诉它在自定义前缀下创建 , 和其他目录,binlib不是.share$HOME/.local

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

请注意,如果它所依赖的任何软件包需要在目录中安装较新的版本,您可能还需要指定--upgrade和选项,以覆盖系统提供的版本。--ignore-installedPYTHONUSERBASE

一个完整的例子

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

..将最新版本安装scipy并打包到一个目录中,然后您可以将其包含在您喜欢的目录中(在此示例中使用 bash 和 CentOS 6 上的 python 2.6):numpyPYTHONPATH

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仍然是一个更好更整洁的解决方案!

于 2015-03-17T15:24:41.173 回答
46

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

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

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

如果您希望所有(或大部分)包裹都去那里,您可以编辑您的~/.pip/pip.conf以包括:

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

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

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

于 2012-06-13T14:39:44.080 回答
45

要 pip 在我想要的位置安装一个库,我使用终端导航到我想要目录的位置,然后使用

pip install mylibraryName -t . 

我从这个页面获取的逻辑:https ://cloud.google.com/appengine/docs/python/googlecloudstorageclient/download

于 2015-08-31T17:46:36.753 回答
28

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

pip install --target /myfolder [包]

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

pip install --prefix /myfolder [包]

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

pip install --root /myfolder [包]

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

pip install --user [包]

将包安装到 $HOME:/home/[USER]/.local/lib/python3.5/site-packages Python 会自动从这个 .local 路径搜索,所以你不需要把它放到你的 PYTHONPATH 中。

=> 在大多数情况下 --user 是最好的选择。如果由于某种原因无法使用主文件夹,则使用--prefix。

于 2018-12-20T14:06:36.223 回答
25
pip3 install "package_name" -t "target_dir"

来源 - https://pip.pypa.io/en/stable/reference/pip_install/

-t 开关=目标

于 2020-05-11T14:09:08.713 回答
23

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

pip install -t <direct directory> <package>
于 2018-02-20T00:02:28.597 回答
16
pip install packageName -t pathOfDirectory

或者

pip install packageName --target pathOfDirectorty
于 2019-02-22T08:35:45.223 回答
15

只需在@Ian Bicking 的回答中添加一点:

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

例如,

pip install --user python-memcached

该命令会将包安装到 PYTHONPATH 中列出的目录之一。

于 2014-12-23T19:46:39.830 回答
14

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

pip install --prefix=$PREFIX_PATH package_name

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

于 2017-05-24T06:37:23.803 回答
5

补充一下已经很好的建议,因为我没有对/usr/local.

pip 使用 distutils 进行安装,该线程讨论了它如何导致问题,因为它依赖于sys.prefix设置。

当 IPython 安装尝试使用Permission denied写入 '/usr/local/share/man/man1' 时,我的问题发生了。由于安装失败,它似乎没有在 bin 目录中写入 IPython 文件。

使用“--user”有效,文件被写入~/.local。将 ~/.local/bin 添加到 $PATH 意味着我可以从那里使用“ipython”。

但是,我正在尝试为许多用户安装它,并且已经获得了对该/usr/local/lib/python2.7目录的写权限。我在那里创建了一个“bin”目录并为 distutils 设置指令:

vim ~/.pydistutils.cfg

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

然后(-I用于强制安装,尽管以前失败/.local 安装):

pip install -I ipython

然后我添加/usr/local/lib/python2.7/bin$PATH.

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

于 2015-05-29T14:24:14.987 回答
3

如果你在 python 中使用 brew,不幸的是,pip/pip3 附带的选项非常有限。您没有上面提到的 --install-option、--target、--user 选项。

关于 pip install --user的注意事项
对于 brewed Python,正常的 pip install --user 是禁用的。这是因为 distutils 中的一个错误,因为 Homebrew 编写了一个 distutils.cfg 来设置包前缀。一种可能的解决方法(将可执行脚本放在 ~/Library/Python/./bin 中)是: python -m pip install --user --install-option="--prefix=" <package-name>

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

brew upgrade python python3

具有讽刺意味的是,您实际上是在降级pip 功能。

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

于 2018-09-17T13:22:47.590 回答
1

v1.5.6使用Python v2.7.3(GNU/Linux)上的pip ,选项--root允许指定全局安装前缀,(显然)与特定包的选项无关。试试看

$ pip install --root=/alternative/prefix/path package_name
于 2014-08-18T14:53:25.033 回答
1

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

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

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

[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 告诉我没有用于卸载过程的包....所以仍然有问题,但包会转到其预定义的位置。

于 2017-12-05T10:57:51.193 回答
1

system` 选项,它将 pip package-bins 安装到所有用户都可以访问的 /usr/local/bin 中。没有此选项的安装可能不适用于所有用户,因为事情会转到用户特定的目录,如 $HOME/.local/bin,然后是用户特定的安装,必须为所有用户重复,如果未设置,也可能存在路径问题对于用户,那么垃圾箱将不起作用。因此,如果您正在寻找所有用户 - 您需要拥有 sudo 访问权限:

sudo su - 
python3 -m pip install --system <module>
logout
log back in 
which <module-bin> --> it should be installed on /usr/local/bin/
于 2021-03-17T13:50:02.537 回答
0

pip install /path/to/package/

现在是可能的。

这与使用-eor--editable标志的区别在于-e链接到保存包的位置(即您的下载文件夹),而不是将其安装到您的 python 路径中。

这意味着如果您将包删除/移动到另一个文件夹,您将无法使用它。

于 2019-01-18T08:37:47.720 回答