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

Posted

技术标签:

【中文标题】使用 pip 将 Python 包安装到不同的目录中?【英文标题】:Install a Python package into a different directory using pip? 【发布时间】:2011-02-24 07:41:50 【问题描述】:

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

那么如何修改命令

pip install package_name

要使pip 将软件包安装在默认site-packages 以外的其他位置?

【问题讨论】:

相关:How to make editable install of Python package from vcs into specific directory using pip? 现在第二个问题:当您已经安装到自定义目录时,如何使pip 不尝试从非自定义目录中删除旧版本。例如 - 一个系统范围的,你没有写权限。到目前为止,我只使用easy_install... @TomaszGandor 我认为使用 --ignore-installed 选项应该可以防止 pip 尝试卸载已安装的软件包。 对不起,我是 pip 的新手,但是您的问题与询问“如何将 pi 安装到不同版本的 python”相同吗?我有 python 3.4 和 3.5,但我希望我的 pip 安装转到 python 3.5。 @Charlie Nope,不同的问题。我对您的安装/意图知之甚少,但通常我可能会使用 virtualenvwrapper 并创建一个类似于 mkvirtualenv --python=/usr/bin/python3.5 env_name 的虚拟环境 【参考方案1】:

用途:

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

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

【讨论】:

如果你这样做,有没有办法让pip freeze看到备用目录? pip freeze 看起来在路径上,所以如果你喜欢PYTHONPATH=$PREFIX_PATH/lib/python2.6/site-packages pip freeze 它应该会看到它们。 使用--prefix=$PREFIX_PATH 似乎不允许完全控制安装目录,因为它附加了系统特定的后缀(例如Windows 上的\Lib\site-packages)。有没有办法指定具体的目录? @Piotr:是的,看到我的答案。使用 '--prefix' 有点粗略,但如果你想让你的纯 python 放在 /usr/lib/pythonX.Y/site-packages 而不是 /usr/local/lib/pythonX.Y/site- 下,效果很好包。 4 年前的答案还不错,但 --target 选项现在存在。【参考方案2】:

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

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

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 等,否则包中包含的任何可执行文件/数据/脚本仍将转到其默认位置,详细信息请参阅custom installation选项)。

【讨论】:

配置文件的一大优点。我个人在那里指定了--prefix,因为我在主目录中的共享服务器上有一个“本地”目录,并且在我移动到pip之前它被easy_install用作前缀。系统 $PATH$PYTHONPATH 之前已配置。而不是install-option=--install-purelib=/blah 有这个更新的target=/blah 选项/开关。这也不错,但有时您只需要替换 --prefix,即可与 setup.pyeasy_install 一起使用。【参考方案3】:

--target 开关就是您要找的东西:

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

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

-t, --target

将软件包安装到

。默认情况下,这不会替换 中的现有文件/文件夹。 使用 --upgrade 将 中的现有包替换为新版本。

如果目标开关不可用,则升级 pip:

在 Linux 或 OS X 上:

pip install -U pip

在 Windows 上(这适用于 an issue):

python -m pip install -U pip

【讨论】:

@DanH 运行 pip install --upgrade pip! 这是真正的答案,只是在接受答案之后添加了相当多的选项。 @Ian Bicking 提到的--install-option="--prefix=$PREFIX_PATH"--target=$PATH 选项有什么区别? target 是一个点子选项,您在install-option 中输入的所有内容都将传递给setup.py install command。基本上target 是自定义站点包位置。 使用--target 可能会导致部分安装,因为它不会安装任何包含指定前缀的脚本/数据文件。似乎将--prefix--install-option 一起传递是完全控制使用的安装前缀的唯一正确方法。【参考方案4】:

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

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

【讨论】:

【参考方案5】:

在@Ian Bicking 的回答中加一分:

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

例如,

pip install --user python-memcached

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

【讨论】:

【参考方案6】:

而不是--target 选项或--install-options 选项,我发现以下方法效果很好(来自https://github.com/pypa/pip/issues/446 上有关此问题的错误的讨论):

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

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

这使用了非常有用的 --user 选项,但告诉它创建 binlibshare 和其他您希望使用自定义前缀而不是 $HOME/.local 的目录。

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

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

完整示例:

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

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

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

【讨论】:

这适用于在 Docker 容器上运行的 Travis CI,而 --install-option="--prefix=$PREFIX_PATH" 解决方案则不能。 Noobie 问题,pip 创建的/bin 文件夹有多重要,--user--PREFIX 一样创建它,而 --target 没有。 如果包安装在全局Python中,需要--ignore-installed 此选项还兼容--editable 和本地安装。 这个选项可以方便地以超级用户的身份为另一个非 root 用户安装软件包,而无需 su(例如,这在容器中可能会出现问题)。【参考方案7】:

补充一下已经很好的建议,因为当我没有对 /usr/local 的写入权限时,我在安装 IPython 时遇到了问题。

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

我的问题发生在 IPython 安装尝试写入“/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 访问权限的机器上遇到类似问题。

【讨论】:

【参考方案8】:

为了准确地在我想要的位置安装库,我使用终端导航到我想要的目录位置

pip install mylibraryName -t . 

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

【讨论】:

-t--target 的简写 这是唯一对我有用的解决方案。 (Windows 7)【参考方案9】:

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

pip install --prefix=$PREFIX_PATH package_name

其中$PREFIX_PATH为安装前缀,lib、bin等***文件夹所在的位置。

【讨论】:

【参考方案10】:

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

【讨论】:

【参考方案11】:

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

pip install -t <direct directory> <package>

【讨论】:

-t 选项是 --target 选项的简短版本,已在另一个答案 (***.com/a/19404371/594053) 中描述:)【参考方案12】:

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

Note 在 pip install --user 普通的 pip install --user 对于 brewed Python 是禁用的。这是因为 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 选项,我花了几个小时来修复它)

【讨论】:

这个带有明确前缀的答案,以及 ignore-installed 由于以前的努力,为我工作:python -m pip install --user --install-option="--prefix='/myFunkyApp/lib'" --ignore-installed &lt;package-name&gt;【参考方案13】:

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

pip install --target /myfolder [包]

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

pip install --prefix /myfolder [packages]

检查是否已安装依赖项。将包安装到 /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。

【讨论】:

在python 2.7.16下运行,--target(或--prefix)例如安装Jinja2-2.10.1.dist-info/,而安装--install-option="--prefix安装 Jinja2-2.10.1-py2.7.egg-info/,这是我真正想要的 并不总是通过environment variables工作。【参考方案14】:

pip install /path/to/package/

现在可以了。

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

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

【讨论】:

这没有回答问题 这让您可以在您放入的路径中安装“本地”包。【参考方案15】:
pip install packageName -t pathOfDirectory

pip install packageName --target pathOfDirectorty

【讨论】:

【参考方案16】:
pip3 install "package_name" -t "target_dir"

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

-t 开关=目标

【讨论】:

@merv 它是不同的,因为它不一样。不是吗?【参考方案17】:

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/

【讨论】:

以上是关于使用 pip 将 Python 包安装到不同的目录中?的主要内容,如果未能解决你的问题,请参考以下文章

在多版本python的pip的安装与对应包的安装

Win-Python3.7使用pip安装失败-用源码安装解决了

python 将pip安装的Python包目录转换为可导入的zip文件,以便在Google App Engine上使用。

离线环境通过pip安装包

阻止包安装到conda基础环境

pip 离线包安装