Pip安装没有安装到正确的目录?

40

我似乎无法正确使用sudo pip install命令将其安装到以下目录:

/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/
为了能够使用Python导入该模块,我需要这样做。
我已经运行过。
sudo pip install scikit-learn --upgrade

结果

Requirement already up-to-date: scikit-learn in /usr/local/lib/python2.7/site-packages
Cleaning up...

然而,它不在正确的目录中。

我如何让sudo pip install安装到正确的目录?

此外,我已经尝试过:

sudo pip install Scrappy

我收到以下消息:

new-host-2:site-packages Chris$ sudo pip install Scrapy
Password:
Requirement already satisfied (use --upgrade to upgrade): Scrapy in /usr/local/lib/python2.7/site-packages
Requirement already satisfied (use --upgrade to upgrade): Twisted>=10.0.0 in /usr/local/lib/python2.7/site-packages (from Scrapy)
Requirement already satisfied (use --upgrade to upgrade): w3lib>=1.8.0 in /usr/local/lib/python2.7/site-packages (from Scrapy)
Requirement already satisfied (use --upgrade to upgrade): queuelib in /usr/local/lib/python2.7/site-packages (from Scrapy)
Requirement already satisfied (use --upgrade to upgrade): lxml in /usr/local/lib/python2.7/site-packages (from Scrapy)
Requirement already satisfied (use --upgrade to upgrade): pyOpenSSL in /usr/local/lib/python2.7/site-packages (from Scrapy)
Requirement already satisfied (use --upgrade to upgrade): cssselect>=0.9 in /usr/local/lib/python2.7/site-packages (from Scrapy)
Requirement already satisfied (use --upgrade to upgrade): six>=1.5.2 in /usr/local/lib/python2.7/site-packages (from Scrapy)
Requirement already satisfied (use --upgrade to upgrade): zope.interface>=3.6.0 in /usr/local/lib/python2.7/site-packages (from Twisted>=10.0.0->Scrapy)
Requirement already satisfied (use --upgrade to upgrade): cryptography>=0.2.1 in /usr/local/lib/python2.7/site-packages (from pyOpenSSL->Scrapy)
Requirement already satisfied (use --upgrade to upgrade): setuptools in /usr/local/lib/python2.7/site-packages (from zope.interface>=3.6.0->Twisted>=10.0.0->Scrapy)
Requirement already satisfied (use --upgrade to upgrade): cffi>=0.8 in /usr/local/lib/python2.7/site-packages (from cryptography>=0.2.1->pyOpenSSL->Scrapy)
Requirement already satisfied (use --upgrade to upgrade): pycparser in /usr/local/lib/python2.7/site-packages (from cffi>=0.8->cryptography>=0.2.1->pyOpenSSL->Scrapy)

这两个例子都表明软件已经被安装,但并不正确。例如,当我在Python中运行以下导入命令时:

import scrapy
---------------------------------------------------------------------------
ImportError                               Traceback (most recent call last)
<ipython-input-6-51c73a18167b> in <module>()
----> 1 import scrapy

ImportError: No module named scrapy

我尝试过以下方法:

sudo ln -s /Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/

你需要运行已安装的pip,以便使用你想要的Python安装版本。也就是说,你可能安装了不止一个Python版本......请检查当前正在使用的Python版本是否为Framework,或者其他版本,并且在你想要使用的Python安装目录中使用pip,它应该位于“bin”目录下。 - dfranca
你如何检查是否正在作为框架运行Python? - Chris
1
输入 "type python" 可以查看你正在运行 Python 的位置。然后输入 "ls -l <带有完整路径的 Python>" 来检查它是否是指向另一个位置的链接。 你可能想要运行位于 /Library/Frameworks/Python.framework/Versions/2.7/bin/python 的那个。 - dfranca
谢谢 - 你说得对,因为我从 "type python" 得到了 "/usr/local/bin/python"。我该如何删除它或者至少让 sudo pip install 始终进入 "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/"?换句话说,我该如何运行安装在我想要的 Python 版本中的 pip? - Chris
2
你可以创建一个指向所需Python版本的链接。例如:sudo ln -s /usr/bin/python /Library/Frameworks/Python.framework/Versions/2.7/bin/python但是,我建议你从框架中运行pip,它可能在路径/Library/Frameworks/Python.framework/Versions/2.7/bin/pip中。因此,请键入/Library/Frameworks/Python.framework/Versions/2.7/bin/pip install <the lib>。 - dfranca
显示剩余4条评论
11个回答

40

从原问题的评论中可以看出,您安装了多个版本的Python,而pip只是使用了错误的版本。

首先,要知道您正在使用哪个版本的Python,只需键入which python。您应该会看到:

which python
/Library/Frameworks/Python.framework/Versions/2.7/bin/python

如果你要选择正确的Python版本,或者:

which python
/usr/bin/python

如果您使用的是“错误”的版本,要让pip使用正确的版本,首先必须更改路径:

 export PATH=/Library/Frameworks/Python.framework/Versions/2.7/bin/python:${PATH}

现在键入'which python'可以得到正确的结果。接下来,安装pip(如果它尚未为此Python安装程序安装)。最后,使用它。现在你应该没问题了。


感谢您的建议!不过我在使用您的解决方案时遇到了问题。我尝试输入:export PATH=/Library/Frameworks/Python.framework/Versions/2.7/bin/python:{PATH},但这并没有起作用。我还尝试了输入export PATH=/Library/Frameworks/Python.framework/Versions/2.7/bin/python:{/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/},但也没有起作用。我还尝试了输入export PATH=/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/。 - Chris
嗨,Chris。首先 - 在我的原始回复中我打错了一个字 - 我在 export PATH=/Library/Frameworks/Python.framework/Versions/2.7/bin/python:${PATH} 中漏掉了一个 "$" 符号。其次 - 当你说它不起作用时 - 你指的是什么?你能具体说明一下吗? - Roy2012
22
注意,直接运行"python -m pip"更为简单,可以确保使用正确版本的Python及其对应的pip。 - rdb

5
这是我在Windows上的解决方法。问题出在有多个Python安装版本。
  1. 使用正确的Python更新路径
  2. 使用python -m pip uninstall pip setuptools卸载pip
  3. 重启Windows,必须重启才会生效

3

Virtualenv是你的好朋友。

即使你想要将一个包添加到你的主要安装中,最好先在虚拟环境中进行操作,以确保与其他包的兼容性。但是,如果你熟悉了virtualenv,你可能会发现没有必要在基础安装中安装任何东西。


2

1 - 有可能有效的方法

pip 可执行文件实际上是一个 Python 脚本。

默认情况下,它包含(在 Linux 上):

#!/usr/bin/python
# EASY-INSTALL-ENTRY-SCRIPT: 'pip==1.5.6','console_scripts','pip'
__requires__ = 'pip==1.5.6'
import sys
from pkg_resources import load_entry_point

if __name__ == '__main__':
    sys.exit(
        load_entry_point('pip==1.5.6', 'console_scripts', 'pip')()
    )

如果您使用的是MacOS,pip将始终使用/usr/bin/python

但这只是默认设置。您仍然可以通过编辑文件或明确使用python来提供所需的python版本。

如果which python返回/usr/bin/python,则在安装自己的版本时出现了问题。如果它是/Library/Frameworks/Python.framework/Versions/2.7/bin/python,则可以直接调用:

sudo python `which pip` install scikit-learn --upgrade

然而,很可能它不会起作用。原因是sudo正在重置所有的环境变量。为使其正常工作,最简单的方法是使用:

sudo -E pip install scikit-learn --upgrade

或者
sudo -E python `which pip` install scikit-learn --upgrade

根据您的设置而定。

2 - 您应该做什么

pip并不是设计为root执行的工具。实际上,最好的方法是安装一个本地的非root Python版本。您只需要通过设置正确的环境变量(如Linux上的PATH)来确保默认使用它,然后使用该Python版本安装pip而不使用sudo

更好的方法是从您的root安装中设置virtualenv

这样,您可以安装/更新任何您想要的内容,而无需root权限,并且再也不必担心为什么sudo pip无法正常工作。您还可以避免向Pypi提供root权限,这将确保您不会将系统库与自己的库混合在一起。


1
“which python” 对我返回:/opt/local/bin/python(使用 macports 安装),这是我想要使用的版本。which pip 返回 /usr/local/bin/pip,它与默认的 python 相关联。如何使用 macports-python 安装 virtualenv,因为根据手册(http://docs.python-guide.org/en/latest/dev/virtualenvs/)我应该使用 pip - Dror

1
您可以更改shebang行。我经常在新系统上这样做。
如果您想让pip安装到当前安装的Python的版本,请更新shebang行以正确的版本pythons路径为准。
例如,要将pip(而不是pip3)更改为安装到Python 3:
#!/usr/bin/python

至:

#!/usr/bin/python3

任何您使用pip安装的模块都应该安装到Python而不是Python。或者您可以更改路径。

这个对我来说完美地解决了问题。 有多个Python和多个Python3。 即使通过pip或pip3安装了一个包,它仍然显示缺少该包。我将pip命令的第一行更改为与我的脚本引用的相同的Python,并重新安装了包。现在一切都解决了。非常感谢。 - urvish

1
我完全同意这些人的观点,最好使用虚拟环境,这样你可以为每个项目设置自定义环境。它非常适合维护,因为对于每个项目来说,它就像一个不同的世界,每次应用程序更新都不会干扰其他项目。
这里可以找到virtualenv的要点,有关安装和第一步骤的相关信息。

好的,这篇文章是两年前发布的。这个链接也很有用 http://www.simononsoftware.com/virtualenv-tutorial/。 - Emily

1

0
在Windows中,当我将pip版本从23.0.1升级到23.2.1时,出现了这个问题。这是在Python 3.10.11中发生的。
为了解决这个问题,我只需将pip降级回23.0.1即可。 python -m pip install pip==23.0.1

0

我尝试过这个方法,它对我有效。

curl -O  https://files.pythonhosted.org/packages/c0/4d/d2cd1171f93245131686b67d905f38cab53bf0edc3fd1a06b9c667c9d046/boto3-1.14.29.tar.gz

tar -zxvf boto3-1.14.29.tar.gz

cd boto3-1.14.29/

用您所需的Python解释器替换X,对于我的情况是python3

sudo pythonX setup.py install

-1

请确保您的pip版本与您的python版本匹配。

要获取您的python版本,请使用以下命令:

python -V

然后安装正确的pip。如果您已经安装了pip,则尝试使用以下命令:

pip-2.5 install ...

pip-2.7 install ...

或者对于那些使用macports的人,请确保您的版本匹配。

port select --list pip

然后更改为您正在使用的相同python版本。

sudo port select --set pip pip27

希望这可以帮助到您。在我的环境中运行良好。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接