Ошибка установки pip с: OSError: [Errno 13] Permission denied on directory

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'
RunLoop
источник
Связанные (только для macOS / homebrew) stackoverflow.com/questions/33004708/…
wim

Ответы:

76

Вариант а) Создайте virtualenv, активируйте его и установите:

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

Вариант б) Установите в свой домашний каталог:

pip install --user -r requirements.txt

Я рекомендую использовать вариант safe (a), чтобы требования этого проекта не мешали требованиям других проектов.

hectorcanto
источник
2
У меня возникла такая ошибка sudo:pip: command not foundв моем экземпляре aws ec2 при выполнении этой команды. Пожалуйста помоги.
user3768495
2
@ user3768495 Возможно, pip по умолчанию не установлен. Какой у вас дистрибутив EC2? Кроме того, python2 может не быть установлен, поэтому вы либо устанавливаете python2, либо используете pip3. Но будьте осторожны с этим.
hectorcanto
33
Я читал, что сейчас это не рекомендуется во многих местах. Похоже, мы должны предостеречь от использования sudo при запуске pip (см. Ответ Берта)
Justus Eapen
3
@JustusEapen: Не знаю, как я к этому отношусь. Я не думаю, что правильный ответ на вопрос OP - это руководство по базовой компьютерной гигиене, в том числе «не запускайте теневой код с разрешениями суперпользователя» и «регулярно чистите зубы». Я считаю, что оптимальный ответ должен указывать на то, что пакеты могут быть установлены для каждого пользователя или в масштабе всей системы, и что установка в масштабе всей системы, как пожелал OP (для этого есть совершенно многочисленные причины), требуется разрешение суперпользователя. Предостережение против установки пакетов на системный путь - это, вероятно, чья-то еще работа по другому вопросу SO.
Tobia Tesan 06
8
голосование против из-за совета sudo. хотя сейчас это работает, в будущем у вас будет много головной боли.
Джеральд
318

Нам действительно следует прекратить рекомендовать использование sudowith pip install. Лучше сначала попробовать pip install --user. Если это не удается, взгляните на верхний пост здесь .

Причина, по которой вы не должны использовать sudo заключается в следующем:

Когда вы запускаете pip с sudo, вы запускаете произвольный код Python из Интернета как пользователь root, что представляет собой довольно большой риск для безопасности. Если кто-то разместит вредоносный проект на PyPI и вы его установите, вы дадите злоумышленнику root-доступ к своей машине.

Берт
источник
5
Хорошее наблюдение. В конце концов, это касается всех sudo x install, всех x(в том числе x = make).
Тобия Тесан,
1
Это тоже решило мою проблему. Что делает добавление --user?
Майлз Джонсон,
1
@MilesJohnson Добавление --userустанавливает пакет в ваш домашний каталог, а не в корень. Установка чего-либо в это место не требует дополнительных привилегий.
bert
1
Кроме того, если вы находитесь на удаленном сервере за прокси-сервером, «sudo» не позволяет вам получать пакеты из интернет-репозиториев и / или репозиториев git в сети удаленного сервера.
Ataxias 02
2
Все упоминания о нем sudoбыли удалены год назад. Этот ответ устарел - отредактируйте и обновите его. Вам также необходимо указать индивидуальные и общесистемные установки и разрешения. Не используйте свой ответ для прямой критики других ответов, поскольку они быстро устареют.
smci 01
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
Запуск pip с root-правами сопряжен с
угрозами
Запуск всего, что запускает код из Интернета от имени пользователя root, сопряжен с угрозами безопасности.
Тобия Тесан 02
Это почти лучший ответ, но он все еще нуждается в обновлении. а) Теперь мы pyenv/pipenvдолжны упомянуть тех, кто предпочитает virtualenv(или conda-env) б) sudo считается вредным, и посмотреть другие ответы, почему. Поэтому сначала поставьте ответ на основе env, а затем sudo с большим отказом от ответственности.
smci 01
1
sudo pip install -r requirements.txtникогда не бывает прав. Системная среда Python принадлежит системе, точка . Если вы все же устанавливаете в систему больше материалов Python, делайте это только с помощью диспетчера пакетов (например sudo yum install, apt-getи т. Д.), Поскольку эти репозитории должны иметь безопасные и совместимые версии имеющихся библиотек.
wim
1
@TobiaTesan Старый sudo make install, обычно скомпилированный + связанный код на самом деле не аналогичен a, sudo pip installпоскольку установка Python env в систему может аннулировать зависимости . Предположим, существует системная служба python-frobnicator, от которой зависит froblib(она также будет в диспетчере пакетов и привязана к совместимой версии), а затем у вас sudo pip installесть другое приложение или библиотека, зависящая от " froblib > 1.2". Пип с радостью «обновит» системную версию на froblibболее новую, которая может быть несовместимой / непроверенной и сломать систему.
wim
26

Просто поясняя, что сработало для меня после долгой боли в Linux (на основе ubuntu) из-за ошибок, запрещенных в разрешении, и используя ответ Берта выше, я теперь использую ...

$ pip install --user <package-name>

или если вы запускаете pip в файле требований ...

$ pip install --user -r requirements.txt

и они надежно работают для каждой установки pip, включая создание виртуальных сред.

Однако, по моему дальнейшему опыту , самым чистым решением была установка python-virtualenvи virtualenvwrapperсsudo apt-get install на системном уровне.

Затем внутри виртуальных сред используйте pip installбез --userфлага И без sudo. В целом намного чище, безопаснее и проще.

Том Айвз
источник
Я получаю сообщение «Невозможно выполнить установку '--user'. Пользовательские пакеты сайтов не видны в этом virtualenv». ошибка при попытке использованияpip install --user -r requirements.txt
Амир А. Шабани
@ AmirA.Shabani ответ был отредактирован после вашего вопроса. Теперь он говорит: «В виртуальных средах используйте pip install без флага --user И без sudo»
Daishi
7

У пользователя нет прав на запись для некоторых путей установки Python. Вы можете дать разрешение:

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

Поэтому вы должны дать разрешение, а затем попытаться установить его снова, если у вас есть новые пути, вы также должны дать разрешение:

sudo chown -R $USER /usr/local/lib/python2.7/
Месут РУЧНИКИ
источник
2
Для python, установленного с brew, это правильный ответ, потому что brew поддерживает пакеты от имени локального пользователя (без root).
idbrii
9
выбор каталога / usr / local - не лучшая идея. Он не принадлежит пользователю. Вы должны прочитать о файловой структуре unix.
user8162 01
6
В /usrнаши дни все, что находится ниже, обычно принадлежит пользователю root. Рекурсивное переедание может серьезно испортить вашу систему. ИЗБЕГАЙТЕ .
wim
0

Если вам нужны разрешения, вы не можете использовать pip с sudo. Вы можете сделать трюк, чтобы вы могли использовать sudo и установить пакет. Просто поместите sudo python -m ... перед командой pip.

sudo python -m pip install --user -r package_name
j35t3r
источник
Мне кажется, это нормально, но не могли бы вы добавить некоторые пояснения.
pythonic833
-1

Итак, я получил ту же самую ошибку по совершенно другой причине. Из-за совершенно отдельной, но известной ошибки Homebrew + pip я последовал этому обходному пути. указанному в справочной документации Google Cloud, где вы создаете файл .pydistutils.cfg в своем домашнем каталоге. Этот файл имеет специальную конфигурацию, которую вы должны использовать только для установки определенных библиотек. Я должен был удалить этот файл disutils.cfg после установки пакетов, но я забыл это сделать. Так что исправление для меня было просто ...

rm ~/.pydistutils.cfg,

А дальше все заработало как обычно. Конечно, если у вас есть какая-то конфигурация в этом файле по реальной причине, вы не захотите просто удалить этот файл. Но в случае, если кто-то другой сделал это обходное решение и забыл удалить этот файл, это помогло мне!

bwest87
источник
-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 это будет установлено внутри вашего env

не говорите, sudo pip install -r requirements.txtэто будет установлено на произвольный путь Python.

Мохидин бин Мохаммед
источник