我知道显而易见的答案是使用 virtualenv 和 virtualenvwrapper,但由于各种原因,我不能/不想这样做。
那么如何修改命令
pip install package_name
将pip
软件包安装在默认位置以外的其他地方site-packages
?
--target开关是您正在寻找的东西:
pip install --target=d:\somewhere\other\than\the\default package_name
但是您仍然需要添加d:\somewhere\other\than\the\default
toPYTHONPATH
才能从该位置实际使用它们。
-t, --target <dir>
将软件包安装到 <dir>。默认情况下,这不会替换 <dir> 中的现有文件/文件夹。
使用 --upgrade 将 <dir> 中的现有包替换为新版本。
如果目标交换机不可用,则升级 pip:
在 Linux 或 OS X 上:
pip install -U pip
在 Windows 上(这解决了一个问题):
python -m pip install -U pip
采用:
pip install --install-option="--prefix=$PREFIX_PATH" package_name
您可能还希望--ignore-installed
使用此新前缀强制重新安装所有依赖项。您可以使用--install-option
to 多次添加您可以使用的任何选项python setup.py install
(--prefix
可能是您想要的,但是您可以使用更多选项)。
而不是--target
or--install-options
选项,我发现设置PYTHONUSERBASE
环境变量效果很好(来自关于这个问题的错误的讨论):
PYTHONUSERBASE=/path/to/install/to pip install --user
(或者PYTHONUSERBASE
在运行命令之前在您的环境中设置目录,使用export PYTHONUSERBASE=/path/to/install/to
)
这使用了非常有用的--user
选项,但告诉它在自定义前缀下创建 , 和其他目录,bin
而lib
不是.share
$HOME/.local
然后,您可以将其添加到您的PATH
,PYTHONPATH
和其他变量中,就像普通安装目录一样。
请注意,如果它所依赖的任何软件包需要在目录中安装较新的版本,您可能还需要指定--upgrade
和选项,以覆盖系统提供的版本。--ignore-installed
PYTHONUSERBASE
PYTHONUSERBASE=/opt/mysterypackage-1.0/python-deps pip install --user --upgrade numpy scipy
..将最新版本安装scipy
并打包到一个目录中,然后您可以将其包含在您喜欢的目录中(在此示例中使用 bash 和 CentOS 6 上的 python 2.6):numpy
PYTHONPATH
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 文件进入(而不是像 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
等,有关详细信息,请查看自定义安装选项) ,否则软件包中包含的任何可执行文件/数据/脚本仍将转到其默认位置。
要 pip 在我想要的位置安装一个库,我使用终端导航到我想要目录的位置,然后使用
pip install mylibraryName -t .
我从这个页面获取的逻辑:https ://cloud.google.com/appengine/docs/python/googlecloudstorageclient/download
使用 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。
pip3 install "package_name" -t "target_dir"
来源 - https://pip.pypa.io/en/stable/reference/pip_install/
-t 开关=目标
似乎没有人提到 -t 选项,但最简单的是:
pip install -t <direct directory> <package>
pip install packageName -t pathOfDirectory
或者
pip install packageName --target pathOfDirectorty
只需在@Ian Bicking 的回答中添加一点:
--user
如果想要将一些 Python 包安装到远程服务器上的主目录(没有 sudo 用户权限),使用指定安装目录的选项也可以工作。
例如,
pip install --user python-memcached
该命令会将包安装到 PYTHONPATH 中列出的目录之一。
较新版本的pip
(8 或更高版本)可以直接使用--prefix
选项:
pip install --prefix=$PREFIX_PATH package_name
where$PREFIX_PATH
是放置 lib、bin 和其他顶级文件夹的安装前缀。
补充一下已经很好的建议,因为当我没有对/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 访问权限的机器上遇到类似的问题。
如果你在 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 选项,我花了几个小时来修复它)
v1.5.6
使用Python v2.7.3
(GNU/Linux)上的pip ,选项--root
允许指定全局安装前缀,(显然)与特定包的选项无关。试试看
$ pip install --root=/alternative/prefix/path package_name
我建议按照文档创建 ~/.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 告诉我没有用于卸载过程的包....所以仍然有问题,但包会转到其预定义的位置。
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 install /path/to/package/
现在是可能的。
这与使用-e
or--editable
标志的区别在于-e
链接到保存包的位置(即您的下载文件夹),而不是将其安装到您的 python 路径中。
这意味着如果您将包删除/移动到另一个文件夹,您将无法使用它。