安装 pip 失败:OSError: [Errno 13] 权限被拒绝在目录上。

161

pip install -r requirements.txt命令出现以下异常:OSError: [Errno 13] Permission denied: '/usr/local/lib/...。出了什么问题,我该怎么修复?(我正在尝试安装Django

Installing collected packages: amqp, anyjson, arrow, beautifulsoup4, billiard, boto, braintree, celery, cffi, cryptography, Django, django-bower, django-braces, django-celery, django-crispy-forms, django-debug-toolbar, django-disqus, django-embed-video, django-filter, django-merchant, django-pagination, django-payments, django-storages, django-vote, django-wysiwyg-redactor, easy-thumbnails, enum34, gnureadline, idna, ipaddress, ipython, kombu, mock, names, ndg-httpsclient, Pillow, pyasn1, pycparser, pycrypto, PyJWT, pyOpenSSL, python-dateutil, pytz, requests, six, sqlparse, stripe, suds-jurko
Cleaning up...
Exception:
Traceback (most recent call last):
  File "/usr/lib/python2.7/dist-packages/pip/basecommand.py", line 122, in main
    status = self.run(options, args)
  File "/usr/lib/python2.7/dist-packages/pip/commands/install.py", line 283, in run
    requirement_set.install(install_options, global_options, root=options.root_path)
  File "/usr/lib/python2.7/dist-packages/pip/req.py", line 1436, in install
    requirement.install(install_options, global_options, *args, **kwargs)
  File "/usr/lib/python2.7/dist-packages/pip/req.py", line 672, in install
    self.move_wheel_files(self.source_dir, root=root)
  File "/usr/lib/python2.7/dist-packages/pip/req.py", line 902, in move_wheel_files
    pycompile=self.pycompile,
  File "/usr/lib/python2.7/dist-packages/pip/wheel.py", line 206, in move_wheel_files
    clobber(source, lib_dir, True)
  File "/usr/lib/python2.7/dist-packages/pip/wheel.py", line 193, in clobber
    os.makedirs(destsubdir)
  File "/usr/lib/python2.7/os.py", line 157, in makedirs
    mkdir(name, mode)
OSError: [Errno 13] Permission denied: '/usr/local/lib/python2.7/dist-packages/amqp-1.4.6.dist-info'

相关(macOS/homebrew特定)https://dev59.com/yVwY5IYBdhLWcg3wHkmK - wim
9个回答

356

不建议使用 sudopip install 一起使用,更好的方法是先尝试使用 pip install --user。如果失败了,请看一下这篇帖子的顶部here

你不应该使用 sudo 的原因如下:

当您使用 sudo 运行 pip 时,相当于以 root 用户身份运行来自互联网上的任意 Python 代码,这是一个非常大的安全风险。如果有人在 PyPI 上发布恶意项目并进行安装,则会使攻击者获得对您的计算机的 root 访问权限。


9
观察得不错。毕竟,对于所有的sudo x install和所有的x(包括x = make)都适用这一点。 - Tobia Tesan
2
这也解决了我的问题。添加 --user 参数是做什么用的? - Miles Johnson
2
@MilesJohnson 添加 --user 将软件包安装在您的主目录中,而不是根目录。将软件安装到此位置不需要任何额外的特权。 - bert
1
此外,如果您在代理后面的远程服务器上,“sudo”将阻止您从互联网存储库和/或远程服务器网络的git存储库中获取软件包。 - Ataxias
2
所有关于 sudo 的提及都在一年前被删除了。这个答案已经过时了 - 请修订和更新它。您还需要提到每个用户与系统范围的安装以及权限。不要使用您的答案直接批评其他答案,因为那往往会很快过时。 - smci
显示剩余3条评论

98

选项a) 创建虚拟环境,激活它并安装:

virtualenv .venv
source .venv/bin/activate
pip install -r requirements.txt

选项b) 在您的主目录中安装:

pip install --user -r requirements.txt

我的建议是使用安全的(a)选项,这样该项目的要求就不会干扰其他项目的要求。


2
当我运行这个命令时,在我的 AWS EC2 实例上出现了这样的错误 sudo:pip: command not found。请帮忙解决。 - user3768495
2
@user3768495 可能默认情况下未安装pip。您的EC2使用哪个发行版?此外,可能未安装python2,因此您可以安装python2或使用pip3。不过请小心。 - hectorcanto
35
现在我已经在多个地方看到不推荐这样做。似乎我们应该注意当运行pip时避免使用sudo(参见Bert的回答)。 - Justus Eapen
3
@JustusEapen说:“我不知道我对此感觉如何。我认为回答OP的问题的适当方式不是提供基本计算机卫生手册,其中包括‘不要用超级用户权限运行可疑代码’和‘定期刷牙’。我认为最佳答案应该指出可以按用户或系统范围安装软件包,而像OP所希望的那样进行系统范围的安装(有完全合理的原因)需要超级用户权限。警告不要将软件包安装在系统路径上可能是其他SO问题中的其他人的工作。” - Tobia Tesan
8
由于提供sudo建议而被投票降权。尽管现在它有效,但在未来它会给你带来很多麻烦。 - Gerald
显示剩余6条评论

30
你正在尝试在系统范围的路径上安装软件包,但没有权限这样做。

  1. 通常情况下,你可以使用 sudo 临时获得超级用户权限,在自己的责任范围内安装软件包到系统范围的路径上:

     sudo pip install -r requirements.txt
    

    这里了解更多关于sudo

    实际上,这是一个不好的想法,并且没有良好的使用案例,请参见@wim的评论。

  2. 如果您不想进行系统范围的更改,可以使用--user标志在您的每个用户路径上安装软件包。

    只需要执行以下操作:

  3.  pip install --user runloop requirements.txt
    
  4. 最后,若要实现更细粒度的控制,您还可以使用virtualenv,这可能是开发环境中更优越的解决方案,特别是如果您正在处理多个项目并想要跟踪每一个项目的依赖关系。

    激活虚拟环境后,使用以下命令将安装包安装到虚拟环境中(而不是全局系统路径):

    $ my-virtualenv/bin/activate

    pip install -r requirements.txt


4
使用root权限运行pip会带来安全风险 - Nrzonline
以 root 身份运行来自互联网的任何代码都存在安全风险。 - Tobia Tesan
2
“sudo pip install -r requirements.txt” 这种做法是不正确的。系统的 Python 环境属于系统,这是毋庸置疑的事实。如果你确实需要在系统中安装更多的 Python 库,请使用包管理器(例如 sudo yum installapt-get 等),因为这些仓库应该提供了安全和兼容的库版本。 - wim
2
@TobiaTesan 旧的 sudo make install,通常是编译+链接代码,与 sudo pip install 不太相似,因为安装到系统 Python 环境可能会使依赖项无效。假设有一个系统服务 python-frobnicator,它依赖于 froblib(这也将在软件包管理器中,并固定为兼容版本),然后您 sudo pip install 一些其他应用程序或库,它依赖于 "froblib > 1.2"。Pip 将高兴地使用更新的版本“升级”系统版本的 froblib,这可能是不兼容/未经测试的,并破坏系统。 - wim
1
@wim 我现在明白你的意思了,我认为这是一个很好的观点。谢谢! - Tobia Tesan
显示剩余4条评论

27

在经历了很多痛苦后,我想澄清一下在Linux(基于Ubuntu)上遇到权限被拒绝错误时对我有用的方法,并借鉴了Bert上面的答案,现在我使用...

$ pip install --user <package-name>

或者如果在要求文件上运行pip ...

$ pip install --user -r requirements.txt

而在我的进一步经验中,最干净的解决方案是在系统级别上使用sudo apt-get install安装python-virtualenvvirtualenvwrapper

然后,在虚拟环境内使用 pip install,不要加上--user标志,也不要使用sudo。总体来说更加清洁,更加安全,也更加容易。


2
当我尝试使用 pip install --user -r requirements.txt 时,出现了“无法执行'--user'安装。在此虚拟环境中,用户站点包不可见。”的错误提示。 - Amir Shabani
@AmirA.Shabani,自您提问以来,答案已进行了编辑。现在它说:“在虚拟环境中,使用pip install命令时不要使用--user标志或sudo命令。” - Daishi

13

用户没有Python安装路径的写入权限。您可以通过以下方式授予权限:

sudo chown -R $USER /absolute/path/to/directory

因此,您应该授予权限,然后再次尝试安装,如果您有新路径,还应该授予权限:

sudo chown -R $USER /usr/local/lib/python2.7/

2
对于使用brew安装的Python来说,这是正确的答案,因为brew将软件包维护为本地用户(无需root权限)。 - idbrii
10
更好的翻译方式如下:改变 /usr/local 目录的所有者(chown)不是一个好主意,因为它不属于用户。您应该了解一下Unix文件结构。 - user8162
6
现在,/usr目录下的东西通常都归属于root用户。递归更改该目录的所有权可能会严重破坏您的系统。请避免这样做。 - wim

0
如果您需要权限,就不能使用'sudo'来运行'pip'。 您可以使用一个小技巧,这样您就可以使用'sudo'并安装软件包。只需在pip命令前面加上'sudo python -m ...'即可。
sudo python -m pip install --user -r package_name

对我来说看起来没问题,但你能否加上一些解释呢? - pythonic833
2
在使用sudo之前,请尝试使用--user选项。 - Brendan Metcalfe

0

以下命令对我有用:

pip install --trusted-host pypi.org --trusted-host files.pythonhosted.org PACKAGE_NAME --user

或者

pip install --user <package name>

例子:

pip install --trusted-host pypi.org --trusted-host files.pythonhosted.org matplotlib --user

-1

所以,我因为完全不同的原因得到了完全相同的错误。由于一个完全独立但已知的Homebrew + pip bug,我按照谷歌云帮助文档中列出的this workaround创建了一个.pydistutils.cfg文件在我的主目录中。这个文件有特殊的配置,你只应该用它来安装某些库。我应该在安装完包后删除那个disutils.cfg文件,但我忘记了这样做。所以对我来说,解决方法实际上只是...

rm ~/.pydistutils.cfg

然后一切都正常工作了。当然,如果你在那个文件中有一些真正需要的配置,那么你不会想直接删除那个文件。但是,如果有其他人也使用了这个解决方法,并且忘记删除那个文件,那么这对我很有用!


-5

这是由于权限问题引起的,

sudo chown -R $USER /path to your python installed directory

默认情况下,它将是/usr/local/lib/python2.7/

或者尝试,

pip install --user -r package_name

然后说,pip install -r requirements.txt 这将安装在您的环境中。
不要说,sudo pip install -r requirements.txt 这将安装到任意的Python路径中。

1
正如在另一个早期的建议中已经指出的那样,不要将系统文件的所有权分配给普通用户。 这只是 sudo pip install 问题的恶化版。 如果你必须做其中之一,那么 sudo pip install 要好得多。 - tripleee

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