我知道显而易见的答案是使用virtualenv和virtualenvwrapper,但出于各种原因,我不能/不想这样做。
那么如何修改命令
1
| pip install package_name |
要让pip在默认site-packages以外的其他地方安装包?
- 相关:如何使用pip将vcs中的python包的可编辑安装到特定目录中?
- 现在第二个问题:当您已经安装到自定义目录中时,如何使pip不尝试从非自定义目录中删除旧版本。例如,在系统范围内,您没有写权限。到目前为止,我只是和easy_install达成了这个协议…
- @Tomaszgandor我认为使用--ignore-installed选项应该可以防止pip试图卸载已经安装的包。
- 抱歉,我刚接触到pip,但您的问题是否与询问"如何将pi安装到不同版本的python"相同?我有python 3.4和3.5,但我希望我的pip安装转到python 3.5。
- @查理不,不同的问题。我对您的安装/意图不太了解,但一般来说,我可能会使用virtualenvwrapper,并使用mkvirtualenv --python=/usr/bin/python3.5 env_name之类的东西创建一个虚拟环境。
- @Monikasulik即使你用的是Docker图像,你也会这样做吗?Docker内部的虚拟环境对我来说似乎很愚蠢,但在大多数情况下,它们都是惊人的!
- 可能不会,但我会避免在同一个Docker图像上同时使用python3.4和3.5,我建议您创建自己的问题:)其他人可能会有更好的见解。
目标开关就是你要找的东西:
1
| pip install --target=d:\somewhere\other\than\the\default package_name |
但您仍然需要将d:\somewhere\other\than\the\default添加到PYTHONPATH中,以便从该位置实际使用它们。
如果目标交换机不可用,请升级pip:
在Linux或OS X上:
在Windows上(这解决了一个问题):
1
| python -m pip install -U pip |
- hmmm:我的PIP版本(在Windows上是1.0.2,为python 2.6安装)回答"当我尝试"--target时没有这样的选项"。
- 它与PIP1.4.1在Windows和Python2.7上协同工作。谢谢。
- @丹跑了埃多克斯1号〔29号〕!
- 这是真正的答案,只是在被接受的答案之后添加了相当多的选项。
- @ian bicking提到的--install-option="--prefix=$PREFIX_PATH"和--target=$PATH选项有什么区别?
- target是一个pip选项,您放入install-option中的所有内容都将传递给setup.py install command。基本上,target是自定义站点包位置。
- 使用--target可能会导致部分安装,因为它不会在指定前缀中安装任何包括脚本/数据文件在内的文件。似乎通过--prefix和--install-option传递--prefix是完全控制已用安装前缀的唯一正确方法。
- 当我尝试使用--targetpip 6.0.8py2.7时,我得到了DistutilsOptionError: must supply either home or prefix/exec-prefix -- not both。
- 请注意,在同时使用--editable时,不支持--target—github.com/pypa/pip/issues/562
- 非常感谢您分享这一信息,这是令人惊讶的难以发现!但是你对Python的看法是错误的。python脚本搜索模块的第一个地方是它自己的文件夹-wich很可能是d:某处而不是默认值
- pip1.5.4说——目标是"没有这样的选择"。
- @你用的是非常老的PIP版本。运行pip install --upgrade pip进行升级。
- @Pieter谢谢,只是使用我公司其他人使用的版本。为了方便起见,我将在本地升级它。
- 不幸的是,如果正在安装的软件包已经存在于系统的其他位置,但该安装已过时且无法更改,则无法执行此操作。
- @在这种情况下,Arthur使用--ignore-installed选项。
- @Kennethhoste你也可以使用--install-option和--target,见stackoverflow.com/questions/26476607。
- 有没有一种方法可以让这个目标选项"永久"以便我不必告诉PIP每次都要安装?我只想把它安装到我的python 3.5,而不是我的python 3.4。我现在在做pip install --target=/usr/local/lib/python3.5/dist-packages pkg_name。
- 然后使用python 3.5位置的pip。
- @都灵测试,是的,但是只有当您从这个位置开始运行时,如果您在a中安装一个包并从b运行python,那么b没有in-python路径,除非您将其添加到那里。我说的对吗?
- @或者重新排列python路径,使您的位置在默认位置之前。
- 我的下一个关于Python世界的实验就是这个。当然,它不起作用,这次的错误是无言的错误消息:distutils.errors.DistutilsOptionError: can't combine user with prefix, exec_prefix/home, or install_(plat)base。
用途:
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)。是否有指定特定目录的方法?
- @彼得奥:是的,有人看到我的答案。使用"--prefix"有点粗糙,但是如果您希望纯Python位于/usr/lib/pythonx.y/site-packages下而不是/usr/local/lib/pythonx.y/site-packages下,那么使用它会很好。
- 它对pip uninstall也有效吗?
- 斯劳兹:如果你使用PYTHONPATH,就像使用pip freeze一样。
- 它不适用于依赖关系,根据下面的答案,--target选项工作得很好
- 4年前的答案不错,但现在有了目标选项。
- 这依赖于使用它的setup.py,而有些包则不需要。下面提到的--target选项现在是一个更强大的解决方案
- 这并不能完美地将所有内容安装到前缀中。--用户给了我更好的结果。
- PYTHONUSERBASE环境变量与pip --user选项相结合,确保所有内容都正确地安装到指定的前缀中,但我的答案还没有像这一点和--target建议那样受到欢迎。
- 亲爱的伊恩,非常感谢。您能不能看一下这篇文章:stackoverflow.com/questions/42699279/…这是同一个问题,但对于没有pip的情况。
- 7年前的答案不错,但现在pip直接使用--prefix选项。
- 这对您获得的卸载不起作用:无法卸载要求django,未安装,因此缺少某些内容
- 有人能给我一个--install-option=标志字符串参数的例子吗?我不知道prefix或PREFIX_PATH指的是什么,也不知道字符串--prefix=$PREFIX_PATH中的$PREFIX_PATH是否应替换为我希望安装python包的位置的路径。像pip install --install-option="--prefix=c:\Users\Bob\Desktop" numpy这样的东西会把numpy安装到Desktop目录吗?
- 正如在Python世界中非常常见的那样,它不起作用——它仍然将包安装到~/.local/lib中。
除了--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选项,但告诉它将bin、lib、share和其他目录设置为自定义前缀,而不是$HOME/.local。
然后,您可以将它添加到您的PATH、PYTHONPATH和其他变量中,就像添加一个普通的安装目录一样。
注意,如果需要在PYTHONUSERBASE目录中安装更新版本的包,您可能还需要指定--upgrade和--ignore-installed选项,以覆盖系统提供的版本。
一个完整的例子:
1
| PYTHONUSERBASE=/opt/mysterypackage-1.0/python-deps pip install --user --upgrade numpy scipy |
..要将scipy和numpy包的最新版本安装到一个目录中,然后您可以像这样包含在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仍然是一个更好、更整洁的解决方案!
- 这适用于在Docker容器上运行的Travis CI,而--install选项="--prefix=$prefix_path"解决方案则不适用。
- 唯一在AmazonLinux上起作用的东西
- 没问题,/bin文件夹pip创建的重要程度如何,--user创建的重要程度与--prefix创建的相同,而--target不重要。
- @乔纳森非常重要!对于许多安装了PIP的软件包,您需要这样做才能使它们的实际命令可用。例如,我使用了"afew"和"fpm"包创建工具,这两个工具都向bin目录添加了一个存根脚本。我一点也不确定如果没有这个,如何将这些作为独立的可执行文件来运行!
- @事实上,这完全是我寻找--target和--prefix选项的替代方案的原因——一次覆盖所有类型的已安装文件:)
- 如果包安装在全局python中,则需要--ignore-installed。
- 似乎是最好的选择。但仍然想知道为什么不支持--prefix…
- 此选项还与--editable和本地安装兼容。
- 此选项非常方便地将软件包作为另一个非根用户的超级用户进行安装,而无需使用EDOCX1(例如,容器中可能存在问题)。
安装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等,有关详细信息,请查看自定义安装选项),否则包中包含的任何可删减项/数据/脚本仍将转到其默认位置。
- 配置文件的一大优点。我个人在这里指定了--prefix,因为我在主目录的共享服务器上有一个"本地"目录,在我移动到pip之前,它被easy_install用作前缀。系统$PATH和$PYTHONPATH以前配置过。与install-option=--install-purelib=/blah不同,这里有一个更新的target=/blah选项/开关。它也很好,但有时您只需要一个--prefix的替代品,您可以使用setup.py或easy_install。
为了精确地在我想要的地方安装一个库,我导航到我想要的位置,然后使用终端目录。
1
| pip install mylibraryName -t . |
我从这个页面上得到的逻辑是:https://cloud.google.com/appengine/docs/python/googlecloudstorageclient/download
似乎没有人提到-t选项,但最简单的是:
1
| pip install -t <direct directory> <package> |
- -t选项是--target选项的简短版本,在另一个答案(stackoverflow.com/a/19404371/594053)中描述了该选项)
只需在@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强制安装,尽管以前有故障/本地安装):
然后我把/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 |