помилка установки pip за допомогою: OSError: [Errno 13] У довіднику відхилено дозвіл


123

pip install -r requirements.txtне вдається за винятком нижче OSError: [Errno 13] Permission denied: '/usr/local/lib/.... Що не так і як це виправити? (Я намагаюся налаштувати Джанго )

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

Відповіді:


76

Варіант a) Створіть virtualenv, активуйте його та встановіть:

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

Варіант b) Встановіть у своєму homedir:

pip install --user -r requirements.txt

Моя рекомендація використовувати безпечний варіант (а), щоб вимоги цього проекту не заважали іншим вимогам проектів.


2
Я отримав подібну помилку sudo:pip: command not foundв моєму екземплярі aws ec2 під час виконання цієї команди. Будь ласка, допоможіть.
користувач3768495

2
@ user3768495 Можливо, pip не встановлений за замовчуванням. Який дистрибутив є вашим EC2? Крім того, python2 може бути не встановлений, тому або ви встановлюєте python2, або використовуєте pip3. Будьте обережні з цим, хоча.
hectorcanto

33
Я читав, що зараз це не рекомендується в кількох місцях. Здається, нам слід застерегти від використання
судо

3
@JustusEapen: Я не знаю, як я до цього ставлюсь. Я не думаю, що правильною відповіддю на питання ОП є посібник з базової гігієни комп’ютера, включаючи "не запускати тіньовий код із дозволом суперпользователя" та "регулярно чисти зуби". Я вважаю, що оптимальна відповідь повинна вказувати на те, що пакети можна встановлювати на кожного користувача або на всій системі, і що встановлення на всій системі, як хотіла ОП (для цього є цілком важкі причини), вимагає дозволу супер користувача. Застереження від встановлення пакунків на системному шляху, ймовірно, є чимось іншим завданням щодо іншого питання SO.
Tobia Tesan

8
відхилення через sudoпоради. незважаючи на те, що це працює зараз, це надасть вам багато головних болів у майбутньому.
Джеральд

318

Ми дійсно повинні припинити консультування використання sudoз pip install. Краще спершу спробувати pip install --user. Якщо це не вдається , то подивіться на вищий пост тут .

Причина, яку ви не повинні використовувати, sudoполягає в наступному:

Коли ви запускаєте pip sudo, ви користуєтесь довільним кодом Python з Інтернету як користувач root, що є досить великим ризиком для безпеки. Якщо хтось виставляє зловмисний проект на PyPI, і ви встановлюєте його, ви надаєте зловмиснику root доступ до вашої машини.


5
Гарне спостереження. Це, зрештою, стосується всіх sudo x install, для всіх x(у тому числі x = make).
Tobia Tesan

1
Це також вирішило мою проблему. Що робить додавання --user?
Майлз Джонсон

1
@MilesJohnson Додавання --userвстановлює пакунок у домашній каталог, а не в root. Встановлення чогось у цьому місці не потребує додаткових привілеїв.
Берт

1
Крім того, якщо ви знаходитесь на віддаленому сервері за проксі-сервером, "sudo" заважає вам отримувати пакунки з Інтернет-сховищ та / або 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, є ризиком для безпеки.
Tobia Tesan

Це майже найкраща відповідь, але все ж потребує оновлення. а) Тепер ми маємо pyenv/pipenvзгадати ті, на відміну від virtualenv(або conda-env) б) судо, що вважаються шкідливими, і подивимось інші відповіді, чому. Тож поставте першу відповідь на основі env, а судо - останню, з великою відмовою.
smci

1
sudo pip install -r requirements.txtніколи не прав. Середовище пітона системи належить до системи, періоду . Якщо ви встановите більше файлів python в систему, робіть це лише з диспетчером пакунків (наприклад sudo yum install, apt-getі т. Д.), Оскільки ці репости повинні мати безпечні та сумісні версії бібліотек.
Вім

1
@TobiaTesan Старий sudo make install, як правило, компільований + зв'язаний код, насправді не аналогічний sudo pip installтому, що встановлення в систему Python env може призвести до скасування залежностей . Припустимо, є системний сервіс python-frobnicator, від якого залежить залежність froblib(це також буде в менеджері пакунків і закріплено на сумісній версії), а потім вам sudo pip installякесь інше додаток або контент, який має залежність від " froblib > 1.2". Pip із задоволенням "оновить" версію системи froblibдо нової версії, яка може бути несумісною / неперевіреною і зламати систему.
wim

26

Тільки роз'яснюючи, що працювало для мене після сильного болю в Linux (заснований на ubuntu) на дозволі, відхиленому помилками, і використовуючи відповідь Берта вище, я зараз використовую

$ pip install --user <package-name>

або якщо працює файл pip у файлі вимог ...

$ pip install --user -r requirements.txt

і вони надійно працюють для кожного встановлення файлів, включаючи створення віртуальних середовищ.

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

Потім у віртуальних середовищах використовуйте pip installбез --userпрапора І без sudo. Набагато чистіший, безпечніший і легший в цілому.


Я отримую "Не можу виконати" --user "встановлення. Користувальницькі сайти-пакети не видно в цьому virtualenv." помилка при спробі використанняpip install --user -r requirements.txt
Amir A. Shabani

@ AmirA.Shabani відповідь редагується з моменту вашого запитання. Тепер написано «у віртуальних середовищах використовуйте встановлення pip без прапора --user AND без судо»
Daishi

7

Користувач не має дозволу на запис для деяких шляхів установки Python. Ви можете надати дозвіл:

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

Отже, ви повинні дати дозвіл, а потім спробувати встановити його знову, якщо у вас є нові шляхи, ви також повинні дати дозвіл:

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

2
Для python, встановленого з brew, це правильна відповідь, оскільки brew підтримує пакунки як локальний користувач (немає кореня).
idbrii

9
задушити / usr / місцевий директор - це не дуже гарна ідея. Це не належить користувачеві. Ви повинні прочитати про структуру файлів Unix.
user8162

6
/usrЦі речі , як правило, належать кореням у ці дні. Рекурсивна закапування там може в основному накрутити вашу систему. УНИЖНІТЬ .
Вім

0

Якщо вам потрібні дозволи, ви не можете використовувати 'pip' із 'sudo'. Ви можете зробити трюк, щоб ви могли використовувати "sudo" та встановити пакет. Просто поставте "sudo python -m ..." перед командою pip.

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.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.