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

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

那么如何修改命令呢

pip install package_name

使pip安装包的地方,而不是默认的site-packages?

828749 次浏览

使用:

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

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

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

假设你的包没有数据/脚本/可执行文件,并且你希望你的Python文件进入/python/packages/package_name(而不是像使用--prefix时那样在/python/packages以下几层的子目录),你可以使用one time命令:

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 install --target=d:\somewhere\other\than\the\default package_name

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

< p > # EYZ0
安装包到<dir>默认情况下,这将不会替换目录中现有的文件/文件夹。
使用——升级以替换目录中现有的包。


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

Linux或OS X操作系统:

pip install -U pip

在Windows上(这在一个问题左右工作):

python -m pip install -U pip

在python# EYZ1 (GNU/Linux)上使用pipi# EYZ0,选项--root允许指定全局安装前缀,(显然)与特定包的选项无关。尝试f.i。,

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

在@Ian Bicking的回答上再加一点:

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

例如,

pip install --user python-memcached

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

而不是--target--install-options选项,我发现设置PYTHONUSERBASE环境变量工作得很好(从一个错误关于这件事的讨论):

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

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

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

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

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

完整的例子

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

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

pip使用distutils来进行安装,这个线程讨论了由于它依赖于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用于强制安装,尽管之前失败了/。本地安装):

pip install -I ipython

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

我想我应该包括这个,以防其他人在他们没有sudo访问的机器上有类似的问题。

为了将库安装在我想要的位置,我导航到我想要的带有终端的目录的位置

pip install mylibraryName -t .

我从这一页中获得的逻辑:https://cloud.google.com/appengine/docs/python/googlecloudstorageclient/download

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

pip install --prefix=$PREFIX_PATH package_name

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

我建议按照文档创建~/.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告诉我没有这样的软件包卸载过程....所以还是有问题,但是包会回到预定义的位置。

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

pip install -t <direct directory> <package>

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

请注意在pip安装——用户
对于已酿造的Python,禁用了正常的pip install——user。这是因为distutils中的一个错误,因为Homebrew编写了一个distutils.cfg来设置包前缀。 一个可能的解决方案(将可执行脚本放在~/Library/Python/./bin中)是: Python -m PIP install——user——install-option="——prefix=" < < /代码> < / p >

您可能会发现这一行非常麻烦。我建议使用pyenv进行管理。 如果你使用

# EYZ0

讽刺的是,你实际上是降级 pip功能。

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

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

# EYZ0

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

PIP install——prefix /myfolder [packages]

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

PIP install——root /myfolder [packages]

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

PIP安装——用户[包]

将包安装到$HOME: /home/[用户]/。local / lib / python3.5 /网站 Python自动从这个.local路径搜索,所以你不需要把它放在你的PYTHONPATH中。< / p > 在大多数情况下——user是最好的选择。 如果主文件夹因为某些原因不能使用,那么——prefix.

# EYZ0

现在是可能的。

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

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

pip install packageName -t pathOfDirectory

pip install packageName --target pathOfDirectorty
pip3 install "package_name" -t "target_dir"

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

-t switch = target

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/