помилка установки 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.