pip安装失败,出现以下错误:OSError:[Errno 13]目录权限被拒绝


123

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)stackoverflow.com/questions/33004708/…–
wim,

Answers:


76

选项a)创建一个virtualenv,将其激活并安装:

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

选项b)安装在您的homedir中:

pip install --user -r requirements.txt

我的建议使用安全(a)选项,以便该项目的需求不会干扰其他项目的需求。


2
sudo:pip: command not found运行此命令时,aws ec2实例上出现了这样的错误。请帮忙。
user3768495 '16

2
@ user3768495可能默认情况下未安装pip。您的EC2是哪个发行版?另外,可能未安装python2,因此您可以安装python2或使用pip3。不过要小心。
hectorcanto

33
我读过,现在不建议在多个地方阅读。似乎我们在运行pip时应注意不要使用sudo(请参阅Bert的答案)
Justus Eapen

3
@JustusEapen:我不知道我对此有何看法。我认为OP的问题的正确答案不是有关基本计算机卫生的手册,包括“请勿在具有超级用户权限的情况下运行可疑代码”和“定期刷牙”。我发现最佳答案应该指出,可以按用户或系统范围安装软件包,并且如OP希望的那样,在系统范围内安装软件包(完全出于繁琐的原因)需要超级用户许可。避免在系统路径上安装软件包可能是其他SO问题的另一项工作。
Tobia Tesan '17

8
由于sudo建议而投票。即使现在可以使用,将来也会给您带来很多麻烦。
杰拉尔德

318

我们真的应该停止建议sudowith 的使用pip install。最好先尝试一下pip install --user。如果失败了,请查看此处的最高职位。

您不应使用的原因sudo如下:

当您使用进行pip操作时sudo,您将以root用户身份从Internet运行任意Python代码,这会带来很大的安全风险。如果有人在PyPI上放置了一个恶意项目,然后安装了该项目,则可以使攻击者具有对计算机的根访问权限。


5
好观察。毕竟,这适用于所有人sudo x install,适用于所有人x(包括x = make)。
Tobia Tesan '17

1
这也解决了我的问题。添加--user有什么作用?
Miles Johnson,

1
@MilesJohnson Adding --user将软件包安装在您的主目录中,而不是根目录中。在此位置安装东西不需要任何额外的特权。
bert

1
此外,如果您位于代理后面的远程服务器上,则“ sudo”会阻止您从远程服务器网络的Internet存储库和/或git存储库中获取软件包。
共济失调

2
sudo一年前删除了所有提及。该答案已过时-请对其进行修改和更新。您还需要提及每用户安装与系统范围内的安装以及权限。不要用您的答案直接批评其他答案,而这些答案往往很快就会过时。
smci

28

您试图在系统范围内的路径上安装软件包,而无须这样做。

  1. 通常,您可以根据自己的职责sudo临时获得超级用户 权限以便在系统范围的路径上安装软件包:

     sudo pip install -r requirements.txt

    sudo 在这里找到更多信息。

    实际上,这不是一个好主意,也没有很好的用例,请参阅@wim的评论。

  2. 如果您不想在系统范围内进行更改,则可以使用该标志将该包安装在每用户路径上--user

    它所需要的只是:

     pip install --user runloop requirements.txt
  3. 最后,对于更细粒度的控制,您还可以使用virtualenv,它可能是开发环境的最佳解决方案,尤其是当您正在处理多个项目并希望跟踪每个人的依赖关系时。

    用以下命令激活您的virtualenv

    $ my-virtualenv/bin/activate

    以下命令会将软件包安装在virtualenv内部(而不是系统范围的路径):

    pip install -r requirements.txt


4
root用户运行pip会带来安全风险
Nrzonline

根本上运行任何从Internet运行代码的操作都会带来安全风险。
Tobia Tesan

这几乎是最好的答案,但仍需要更新。a)现在,我们pyenv/pipenv应该优先于virtualenv(或conda-env)b)提到那些有害的东西,然后看看其他答案为什么。因此,将基于env的答案放在首位,将sudo放在最后,并带有很大的免责声明。
smci

1
sudo pip install -r requirements.txt永远是不对的。系统的python环境属于system,period。如果你安装更多的蟒蛇的东西进入系统,做到用包管理器只(例如sudo yum installapt-get等...),因为这些回购应该有果库的安全和兼容版本。
wim

1
@TobiaTesan旧的sudo make install,通常是经过编译的+链接的代码与a并没有真正的相似之处,sudo pip install因为在系统中安装Python env可以使依赖项无效。假设有一个系统服务python-frobnicator,它具有依赖关系froblib(这也将在软件包管理器中并固定到兼容版本),然后您sudo pip install又有一个其他应用程序或lib依赖于“ froblib > 1.2”。Pip会很乐意froblib用较新的版本“升级”其系统版本,该版本可能不兼容/未经测试并破坏了系统。
WIM

26

只是澄清在Linux(基于ubuntu)上由于权限被拒绝的错误而遭受了很多痛苦之后,什么对我有用,并利用了上面Bert的回答,我现在使用...

$ pip install --user <package-name>

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

$ pip install --user -r requirements.txt

并且这些功能对于每个pip安装(包括创建虚拟环境)都可靠地起作用。

然而,干净的解决方案在我进一步的经验已经安装python-virtualenv,并virtualenvwrappersudo apt-get install在系统级。

然后,在虚拟环境中,使用pip install不带--user标志AND不带sudo。整体上更清洁,更安全,更轻松。


我收到“无法执行'--user'安装。在此virtualenv中看不到用户站点包。” 尝试使用时出现错误pip install --user -r requirements.txt
Amir A. Shabani

自您的问题以来,@ AmirA.Shabani的答案已被编辑。现在它说“在虚拟环境中,使用不带--user标志且不带sudo的pip安装”
Daishi

7

用户没有某些Python安装路径的写许可权。您可以通过以下方式给予许可:

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

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

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

2
对于安装了brew的python,这是正确的答案,因为brew将软件包维护为本地用户(无root)。
idbrii

9
设置/ usr / local目录不是一个好主意。它不属于用户。您应该阅读有关UNIX文件结构的信息。
user8162

6
/usr这些天来,东西通常通常是由根拥有的。在那儿递归锁定可能会严重破坏系统。避免
WIM

0

如果需要权限,则不能将'pip'与'sudo'一起使用。您可以做一个技巧,以便可以使用“ sudo”并安装软件包。只需在您的pip命令前面放置“ sudo python -m ...”即可。

sudo python -m pip install --user -r package_name

对我来说似乎不错,但请您补充说明。
pythonic833

-1

因此,由于完全不同的原因,我得到了相同的确切错误。由于完全独立但已知的Homebrew + pip错误,我遵循了Google Cloud帮助文档中列出的此变通办法,您可以在主目录中创建.pydistutils.cfg文件。该文件具有特殊的配置,只应将其用于安装某些库。安装软件包后,我应该已经删除了该disutils.cfg文件,但我忘记这样做了。所以对我来说实际上就是

rm ~/.pydistutils.cfg

然后一切正常。当然,如果确实有原因在该文件中有一些配置,那么您将不希望直接对该文件进行管理。但是,如果其他任何人都做了该解决方法,却忘了删除该文件,这对我来说就成功了!


-1

是适当的许可问题,

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路径中。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.