OSX El Capitan: sudo pip install OSError: [Errno: 1] Операция запрещена

127

Когда я бегу:

sudo pip install ipython

Я получаю следующую ошибку

OSError: [Errno: 1] Операция запрещена: '/System/Library/Frameworks/Python.framework/Versions/2.7/share'

Последняя выполненная команда пытается создать каталог, указанный выше.

Кроме того, следующая команда не может установить iPython без каких-либо ошибок.

sudo pip install --user python

(Я использую Mac OS X El Capitan на случай, если другие пользователи этой ОС увидят ту же проблему.)

Милад М
источник
Я добавил ответ, в котором объясняется, как изменить ваш файл, $PATHчтобы вы могли вызывать исполняемые файлы для установленных пакетов --user. stackoverflow.com/a/47102398/117471
Бруно Броноски
2
Не следует использовать sudoс --user. Что --userнужно установить, ~/Libraryа не то, что /Libraryвам не нужно использовать sudoдля установки там. Но после установки с sudoпомощью все каталоги и файлы принадлежат root. Тогда вы должны использовать sudoчто-нибудь еще с ними. Что, в свою очередь, потребует от вас использования sudoдля других целей, для которых вы не должны его использовать. Тогда даже честная ошибка может перерасти в ошибку или уничтожить данные.
Бруно Броноски

Ответы:

205

Инструкции sudo pip installпо своей сути неверны.

Если есть какое-либо руководство, в котором говорится, что вы должны это сделать, sudo pipпожалуйста, сообщите об ошибке в этом пакете. Автор дезинформирует сообщество Python, поскольку время оказалось sudo pipнеуместным.

OSX El Capitan представила механизмы для предотвращения повреждения файлов операционной системы . /System/Library/Frameworks/Python.framework/Versions/2.7/shareодно из охраняемых мест. У обычного пользователя нет причин помещать или записывать туда какие-либо файлы . Это связано с тем, что сама операционная система полагается на эти файлы и sudo pipсо всей силой, указанной выше, безоговорочно перезапишет их. Обычно плохого не бывает, но есть шанс. Apple хочет защитить пользователей своих ОС от случайного прерывания их установки.

Вместо этого вам нужно установить пакет Python, например IPython, локально в домашнюю папку вашего пользователя . Самый простой способ - создать виртуальную среду , активировать ее, а затем запустить pip в виртуальной среде.

Пример:

cd ~  # Go to home directory
virtualenv my-venv
source my-venv/bin/activate
pip install IPython

Больше информации

Как вариант, надо уметь pip install --user. Но опять же, sudo не требуется, и вам нужно вручную настроить PATHпеременную среды.

Микко Охтамаа
источник
5
Если нет virtualenv, и вы хотите глобально (например, /Library/Python/2.7/site-packages) устанавливать модули, попробуйте мое решение ниже, используя easy_install stackoverflow.com/a/33463702/3078330
smat88dd
3
Есть ли у вас ссылка на эту точку зрения на то, что 'sudo pip' плохой («поскольку время доказало, что sudo pip - негодная практика»)? Я не вижу обсуждения sudo в цитированных вами цитатах, и в учебнике первый шаг к созданию virtualenvs указан как «pip install virtualenv», который, кажется, создает циклическую зависимость, пытаясь следовать вашему совету.
Фон
1
@Von: pip install virtualenvбольше не требуется для Python 3.4+, так как они имеют встроенный python -m venvэквивалент virtualenv. docs.python.org/3/library/venv.html
Микко Охтамаа,
29
При всем уважении, это не отвечает на исходный вопрос. Я пытаюсь установить IPython и сделать его доступным глобально (для всех пользователей на моей машине), и ни виртуальный сервер, ни pip install --user IPythonпомощь в этом. Более того, pip install --user IPythonне удается разместить ipythonкоманду в $PATH(по крайней мере, на моей машине).
jpetazzo
3
Вы научили меня, а также сэкономили мое время. Большое спасибо, я перестал использовать sudo, и все заработало! Отличный ответ.
Парт Гупта
24

У меня были те же проблемы, но использование easy_install "module"решило проблему для меня.

Я не уверен, почему, но pip и easy_install используют разные места установки, а easy_install выбрала правильные.

Изменить: без повторной проверки, но из-за комментариев; кажется, что разные установки (OSX и brew-installed) мешают друг другу, поэтому упомянутые инструменты действительно указывают на разные места (поскольку они принадлежат к разным установкам). Я понимаю, что обычно эти инструменты из одной точки установки в одну и ту же папку.

smat88dd
источник
У вас установлены два разных интерпретатора Python и easy_installнастроены ли они для другого?
Микко Охтамаа
У меня есть установлены 2-3 разные версии Python, но у меня есть easy_installдля всех из них: easy_install-2.6, easy_install-2.7,easy_install-3.5
smat88dd
Скорее всего, pipи easy_installуказывают на разные Python. Вы можете выяснить это с помощью whichкоманды UNIX, а затем выяснить, какую pipкоманду использовать.
Микко Охтамаа
1
Может быть, перед обновлением будет произведена предварительная установка со старой OSX?
Микко Охтамаа
1
pip и easy_install используют разные места установки - нет, они используют одни и те же места. Это сработало случайно, поскольку @MikkoOhtamaa пытался показать вам в своих комментариях. Это явно не ответ.
Петр Доброгост
19

Вам следует переустановить Python:

brew reinstall python

Чтобы получить варево, посетите домашнюю страницу .

Дэвид Эйлер
источник
Я второй. я бегу brew install pythonто думаю pipуже на месте. После этого pipинсталляции работал (я имел аналогичные проблемы ж / разрешений и пип тартание на установках)
travelingbones
15

pip install --ignore-installed six

Это сделает работу, тогда вы можете попробовать свою первую команду.

Через http://github.com/pypa/pip/issues/3165

Алиреза Самар
источник
В моем случае мне тоже пришлось это сделать pip install --ignore-installed setuptools.
ithos67
2
Нет, это не сработает из-за отсутствия разрешений.
Петр Доброгост
11

Используется pip3 install <package>вместо этого и решает проблему с разрешением с помощью pip.

Кенг
источник
10
К вашему сведению, это сработало, потому что pip3использует Python 3, который обычно устанавливается пользователем. Python 2 (2.7), с другой стороны, поставляется с macOS и защищен, как объясняется в самом популярном ответе.
Хан Нгуен
10

TL; исправление DR $ PATH

  1. Используется pip install --user package_nameдля установки пакета, который должен включать исполняемые файлы CLI.
  2. Запустите оболочку python и import package_name
  3. Найдите lib/python/...место на выходе и замените все наbin
  4. Скорее всего будет $HOME/Library/Python/2.7/bin

подробности

Благодаря новой защите целостности системы в macOS 10.11 El Capitan вы больше не можете sudo pip install. Мы не будем здесь обсуждать достоинства этого.

Другой ответ объясняет, что вы должны, pip install --userчто правильно. Но они отправили вас в закоулки, чтобы выяснить, что с ними делать, $PATHчтобы вы могли получить доступ к установленным исполняемым файлам. К счастью, я уже решил подобную потребность в несвязанном вопросе .

Вот запись того, как я решил проблему на одной из моих систем. Я включаю все это, а не то, $PATHчто у меня сработало, потому что ваша система может отличаться от моей. Этот процесс должен работать для всех.

$ pip install --user jp
Collecting jp
  Downloading jp-0.2.4.tar.gz
Installing collected packages: jp
  Running setup.py install for jp ... done
Successfully installed jp-0.2.4

$ python -c 'import jp; print jp'
<module 'jp' from '/Users/bbronosky/Library/Python/2.7/lib/python/site-packages/jp/__init__.pyc'>

$ find /Users/bbronosky/Library/Python -type f -perm -100
/Users/bbronosky/Library/Python/2.7/bin/jp

$ which jp

$ echo -e '\n''export PATH=$HOME/Library/Python/2.7/bin:$PATH' >> ~/.bashrc

$ bash # starting a new bash process for demo, but you should open a new terminal

$ which jp
/Users/bbronosky/Library/Python/2.7/bin/jp

$ jp
usage: jp <expression> <filepath>
Бруно Броноски
источник
10

Та же ошибка

Installing collected packages: six, pyparsing, packaging, appdirs, setuptools
Exception:
Traceback (most recent call last):
  File "/Library/Python/2.7/site-packages/pip-9.0.1-py2.7.egg/pip/basecommand.py", line 215, in main
    status = self.run(options, args)
  File "/Library/Python/2.7/site-packages/pip-9.0.1-py2.7.egg/pip/commands/install.py", line 342, in run
    prefix=options.prefix_path,
  File "/Library/Python/2.7/site-packages/pip-9.0.1-py2.7.egg/pip/req/req_set.py", line 784, in install
    **kwargs
  File "/Library/Python/2.7/site-packages/pip-9.0.1-py2.7.egg/pip/req/req_install.py", line 851, in install
    self.move_wheel_files(self.source_dir, root=root, prefix=prefix)
  File "/Library/Python/2.7/site-packages/pip-9.0.1-py2.7.egg/pip/req/req_install.py", line 1064, in move_wheel_files
    isolated=self.isolated,
  File "/Library/Python/2.7/site-packages/pip-9.0.1-py2.7.egg/pip/wheel.py", line 345, in move_wheel_files
    clobber(source, lib_dir, True)
  File "/Library/Python/2.7/site-packages/pip-9.0.1-py2.7.egg/pip/wheel.py", line 323, in clobber
    shutil.copyfile(srcfile, destfile)
  File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/shutil.py", line 83, in copyfile
    with open(dst, 'wb') as fdst:
IOError: [Errno 13] Permission denied: '/Library/Python/2.7/site-packages/six.py'

и здесь я использую --userбез, sudoчтобы решить эту проблему

$ pip install --user scikit-image h5py keras pygame
Collecting scikit-image
  Downloading http://mirrors.aliyun.com/pypi/packages/65/69/27a1d55ce8f77c8ac757938707105b1070ff4f2ae47d2dc99461bfae4491/scikit_image-0.13.0-cp27-cp27m-macosx_10_6_intel.macosx_10_9_intel.macosx_10_9_x86_64.macosx_10_10_intel.macosx_10_10_x86_64.whl (28.1MB)
    100% |████████████████████████████████| 28.1MB 380kB/s
Collecting h5py
  Downloading http://mirrors.aliyun.com/pypi/packages/b7/cc/1c29b0815b12de2c92b5323cad60f724ac8f0e39d0166d0b9dfacbcb70dd/h5py-2.7.0-cp27-cp27m-macosx_10_6_intel.macosx_10_9_intel.macosx_10_9_x86_64.macosx_10_10_intel.macosx_10_10_x86_64.whl (4.5MB)
    100% |████████████████████████████████| 4.5MB 503kB/s
Requirement already satisfied: keras in /Library/Python/2.7/site-packages
Requirement already satisfied: pygame in /Library/Python/2.7/site-packages
Requirement already satisfied: matplotlib>=1.3.1 in /System/Library/Frameworks/Python.framework/Versions/2.7/Extras/lib/python (from scikit-image)
Requirement already satisfied: six>=1.7.3 in /Library/Python/2.7/site-packages (from scikit-image)
Requirement already satisfied: pillow>=2.1.0 in /Library/Python/2.7/site-packages (from scikit-image)
Requirement already satisfied: networkx>=1.8 in /Library/Python/2.7/site-packages (from scikit-image)
Requirement already satisfied: PyWavelets>=0.4.0 in /Library/Python/2.7/site-packages (from scikit-image)
Collecting scipy>=0.17.0 (from scikit-image)
  Downloading http://mirrors.aliyun.com/pypi/packages/72/eb/d398b9f63ee936575edc62520477d6c2353ed013bacd656bd0c8bc1d0fa7/scipy-0.19.0-cp27-cp27m-macosx_10_6_intel.macosx_10_9_intel.macosx_10_9_x86_64.macosx_10_10_intel.macosx_10_10_x86_64.whl (16.2MB)
    100% |████████████████████████████████| 16.2MB 990kB/s
Requirement already satisfied: numpy>=1.7 in /Library/Python/2.7/site-packages (from h5py)
Requirement already satisfied: theano in /Library/Python/2.7/site-packages (from keras)
Requirement already satisfied: pyyaml in /Library/Python/2.7/site-packages (from keras)
Requirement already satisfied: python-dateutil in /System/Library/Frameworks/Python.framework/Versions/2.7/Extras/lib/python (from matplotlib>=1.3.1->scikit-image)
Requirement already satisfied: tornado in /Library/Python/2.7/site-packages (from matplotlib>=1.3.1->scikit-image)
Requirement already satisfied: pyparsing>=1.5.6 in /Users/qiuwei/Library/Python/2.7/lib/python/site-packages (from matplotlib>=1.3.1->scikit-image)
Requirement already satisfied: nose in /Library/Python/2.7/site-packages (from matplotlib>=1.3.1->scikit-image)
Requirement already satisfied: olefile in /Library/Python/2.7/site-packages (from pillow>=2.1.0->scikit-image)
Requirement already satisfied: decorator>=3.4.0 in /Library/Python/2.7/site-packages (from networkx>=1.8->scikit-image)
Requirement already satisfied: singledispatch in /Library/Python/2.7/site-packages (from tornado->matplotlib>=1.3.1->scikit-image)
Requirement already satisfied: certifi in /Library/Python/2.7/site-packages (from tornado->matplotlib>=1.3.1->scikit-image)
Requirement already satisfied: backports_abc>=0.4 in /Library/Python/2.7/site-packages (from tornado->matplotlib>=1.3.1->scikit-image)
Installing collected packages: scipy, scikit-image, h5py
Successfully installed h5py-2.7.0 scikit-image-0.13.0 scipy-0.19.0 

Надеюсь, это поможет тому, кто столкнется с подобной проблемой!

GoingMyWay
источник
3
Не следует использовать sudoс --user. Что --userнужно установить, ~/Libraryа не то, что /Libraryвам не нужно использовать sudoдля установки там. Но после установки с sudoпомощью все каталоги и файлы принадлежат root. Тогда вы должны использовать sudoчто-нибудь еще с ними. Что, в свою очередь, потребует от вас использования sudoдля других целей, для которых вы не должны его использовать. Тогда даже честная ошибка может перерасти в ошибку или уничтожить данные.
Бруно Броноски
9

У меня были такие же проблемы. Как уже упоминалось, не запускайте pip install с помощью sudo. Бегать

brew doctor 

и исправьте предупреждения, и вы сможете продолжить установку pip.

Apadana
источник
6

Трудно заставить pip работать на El Capitan по нескольким причинам:

  1. OS X некорректно устанавливает некоторые переменные distutils, поэтому pip пытается установить вспомогательные файлы в каталогах ниже /System/Library/. El Capitan блокирует это, и это ошибка, с которой вы столкнулись.
  2. OS X включает ряд устаревших пакетов под /System/Library/. pip часто хочет обновить их, но не может на El Capitan.
  3. OS X занимает /System/Library/более высокое место в порядке поиска python, чем /Library/Python/2.7/site-packages(общесистемное расположение пакета python), поэтому даже если вам удастся установить более новые версии некоторых пакетов, старые все равно будут загружаться, нарушая некоторые зависимости.

Для всего этого есть обходные пути на https://apple.stackexchange.com/a/223163/143849 . Но вам может быть лучше установить свою собственную версию Python через стандартный установщик Python, Homebrew или Anaconda.

Маттиас Фрипп
источник
4

Я думаю, у вас есть конфликт с другим пакетом. Для меня это было six. Итак, вам нужно использовать такую ​​команду:

pip install google-api-python-client --upgrade --ignore-installed six

или

pip install --ignore-installed six

Рухул Амин
источник
3
Какую часть ответа @MikkoOhtamaa вы не понимаете, что все еще предлагаете использовать sudo с pip ?
Петр Доброгост
@PiotrDobrogost, почему бы тебе не прочитать как следует, прежде чем спросить. Мой ответ относительно six.
Рухул Амин
3
Опять же, какую часть ответа @MikkoOhtamaa вы не понимаете, что все еще предлагаете использовать sudo с pip ?
Петр Доброгост
1

Я полностью согласен с Микко, но если вы все еще хотите это сделать, вот способ:

  • Перезагрузка в режиме восстановления (Зажать cmd + R)
  • Открыть терминал из утилит
  • Используйте команду csrutil disable
gilliM
источник
6
Это может быть опасный совет без объяснения последствий отключения защиты целостности системы. Одним из соображений является ожидание, что он больше никогда не будет работать должным образом, если вы не включите его относительно быстро, как в Windows UAC и виртуализации.
Энди Магун
0

У меня установлен python2.7 через brew, и моя проблема решена следующим образом

варить установить numpy

Он устанавливает python3, но все еще работает и настраивает его для версии 2.7.

Aerodyno
источник
Сработало безупречно. Спасибо!!
NightFury