OSX El Capitan: sudo pip install OSError: [Errno: 1] Operacja niedozwolona

127

Kiedy biegam:

sudo pip install ipython

Otrzymuję następujący błąd

OSError: [Errno: 1] Operacja niedozwolona: „/System/Library/Frameworks/Python.framework/Versions/2.7/share”

Ostatnia wykonana komenda próbuje utworzyć katalog podany powyżej.

Ponadto poniższe polecenie nie instaluje iPythona bez podania żadnych błędów.

sudo pip install --user python

(Korzystam z systemu Mac OS X El Capitan na wypadek, gdyby inni użytkownicy tego systemu operacyjnego zobaczyli ten sam problem).

Milad M.
źródło
Dodałem odpowiedź, która wyjaśnia, jak zmodyfikować twój $PATH, abyś mógł wywoływać pliki wykonywalne dla zainstalowanych pakietów --user. stackoverflow.com/a/47102398/117471
Bruno Bronosky
2
Nie powinieneś używać sudoz --user. To, co --userrobi, jest instalowane, ~/Librarya /Librarynie nie musisz go używać, sudoaby zainstalować tam. Ale po zainstalowaniu z programem sudowszystkie katalogi i pliki są własnością root. Następnie musisz sudozrobić z nimi cokolwiek innego. Co z kolei będzie wymagało użycia sudodo innych rzeczy, do których nie powinieneś go używać. Wtedy nawet uczciwy błąd może przejść od wyrzucenia błędu do zniszczenia danych.
Bruno Bronosky

Odpowiedzi:

205

Mówienie instrukcji sudo pip installjest z natury błędne.

Jeśli istnieje jakikolwiek tutorial, który mówi, że powinieneś to zrobić, sudo pipzgłoś błąd dotyczący tego pakietu. Autor dezedukuje społeczność Pythona, ponieważ czas okazał sudo pipsię zepsutą praktyką.

OSX El Capitan wprowadził mechanizmy zapobiegające uszkodzeniu plików systemu operacyjnego . /System/Library/Frameworks/Python.framework/Versions/2.7/sharejest jedną z chronionych lokalizacji. Zwykły użytkownik nie ma powodu, aby umieszczać lub zapisywać tam jakiekolwiek pliki . Dzieje się tak, ponieważ sam system operacyjny opiera się na tych plikach i sudo pip, z całą siłą podaną powyżej, bezwarunkowo je nadpisuje. Zwykle złe rzeczy się nie zdarzają, ale są szanse. Apple chce chronić użytkowników swoich systemów operacyjnych przed przypadkowym zablokowaniem instalacji.

Zamiast tego musisz zainstalować pakiet Pythona, taki jak IPython, lokalnie w folderze domowym użytkownika . Najłatwiej jest stworzyć środowisko wirtualne , aktywować je, a następnie uruchomić pip w środowisku wirtualnym.

Przykład:

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

Więcej informacji

Alternatywnie, można to zrobić pip install --user. Ale znowu nie jest potrzebne sudo i musisz ręcznie ustawić PATHzmienną środowiskową.

Mikko Ohtamaa
źródło
5
Jeśli żaden virtualenv nie jest pożądany i chcesz globalnie (np. /Library/Python/2.7/site-packages) instalować moduły, wypróbuj moje rozwiązanie poniżej, używając easy_install stackoverflow.com/a/33463702/3078330
smat88dd
3
Czy masz powody, dla których ta perspektywa mówi, że „sudo pip” jest złe („w miarę upływu czasu okazało się, że sudo pip to zepsuta praktyka”)? Nie widzę żadnej dyskusji na temat sudo w cytatach, które podajesz, a samouczek wymienia pierwszy krok do tworzenia virtualenv jako „pip install virtualenv”, co wydaje się tworzyć zależność cykliczną, próbując postępować zgodnie z twoimi radami.
Von
1
@Von: pip install virtualenvnie powinny być już potrzebne w Pythonie 3.4+, ponieważ są dostarczane z wbudowanym python -m venvodpowiednikiem virtualenv. docs.python.org/3/library/venv.html
Mikko Ohtamaa
29
Z całym szacunkiem nie dotyczy to pierwotnego pytania. Próbuję zainstalować IPython i udostępnić go globalnie (dla wszystkich użytkowników na moim komputerze), ale ani virtualenv, ani pip install --user IPythonw tym nie pomagam. Ponadto pip install --user IPythonnie udaje się umieścić ipythonpolecenia w $PATH(przynajmniej na moim komputerze).
jpetazzo
3
Nauczyłeś mnie, a także zaoszczędziłeś mój czas. Wielkie dzięki, że przestałem używać sudo i wszystko działało! Świetna odpowiedź.
Parth Gupta
24

Miałem te same problemy, ale użycie easy_install "module"rozwiązało problem za mnie.

Nie jestem pewien, dlaczego, ale pip i easy_install używają różnych lokalizacji instalacji, a easy_install wybrała właściwe.

Edycja: bez ponownego sprawdzania, ale z powodu komentarzy; wydaje się, że różne instalacje (OSX i brew-installed) kolidują ze sobą, dlatego wspomniane narzędzia rzeczywiście wskazują różne lokalizacje (ponieważ należą do różnych instalacji). Rozumiem, że zwykle te narzędzia z jednego punktu instalacji do tego samego folderu.

smat88dd
źródło
Czy masz zainstalowane dwa różne interpretery Pythona i czy masz easy_installskonfigurowany inny?
Mikko Ohtamaa
Mam zainstalowany 2-3 różne wersje Pythona, ale mam easy_installdla nich wszystkich: easy_install-2.6, easy_install-2.7,easy_install-3.5
smat88dd
Najprawdopodobniej pipi easy_installwskaż różne Pythona. Możesz to rozgryźć za pomocą whichpolecenia UNIX, a następnie znaleźć właściwe pippolecenie.
Mikko Ohtamaa
1
Może być wcześniejsza instalacja ze starego OSX przed aktualizacją?
Mikko Ohtamaa
1
pip i easy_install używają różnych lokalizacji instalacji - nie, używają dokładnie tych samych lokalizacji. To działało przez przypadek jako @MikkoOhtamaa starałem się pokazać w swoich komentarzach. To wyraźnie brak odpowiedzi.
Piotr Dobrogost
19

Powinieneś ponownie zainstalować Pythona:

brew reinstall python

Aby uzyskać napar, zobacz stronę główną piwa .

david euler
źródło
Ja po drugie. biegnę brew install pythonwtedy myślę, że pipjest już na miejscu. Po tym pipinstalacja zadziałała (miałem podobne problemy z pozwoleniami i bilingiem pip podczas instalacji)
travellingbones
15

pip install --ignore-installed six

To wystarczy, a następnie możesz wypróbować swoje pierwsze polecenie.

Via http://github.com/pypa/pip/issues/3165

Alireza Samar
źródło
W moim przypadku też musiałem to zrobić pip install --ignore-installed setuptools.
ithos67
2
Nie, to nie zadziała z powodu braku uprawnień.
Piotr Dobrogost
11

Używany pip3 install <package>zamiast tego i rozwiązany problem z uprawnieniami z pip.

Keng
źródło
10
FYI, to zadziałało, ponieważ pip3używa Pythona 3, który jest zwykle instalowany przez użytkownika. Z drugiej strony Python 2 (2.7) jest dostarczany z systemem macOS i jest chroniony, jak wyjaśnia najwyżej oceniana odpowiedź.
Khanh Nguyen
10

TL; DR $ PATH fix

  1. Służy pip install --user package_namedo instalowania pakietu, który powinien zawierać pliki wykonywalne CLI.
  2. Uruchom powłokę Pythona i import package_name
  3. Znajdź, gdzie lib/python/...występuje w danych wyjściowych i zamień to wszystko nabin
  4. Prawdopodobnie tak będzie $HOME/Library/Python/2.7/bin

Detale

Ze względu na nową ochronę integralności systemu w macOS 10.11 El Capitan nie możesz już tego zrobić sudo pip install. Nie będziemy tutaj dyskutować o zaletach tego.

Inna odpowiedź wyjaśnia, że ​​powinieneś, pip install --userco jest poprawne. Ale wysłali cię do tylnych zaułków, aby dowiedzieć się, co z tym zrobić $PATH, aby uzyskać dostęp do zainstalowanych plików wykonywalnych. Na szczęście rozwiązałem już podobną potrzebę na niepowiązane pytanie .

Oto zapis tego, jak rozwiązałem problem w jednym z moich systemów. Włączam to wszystko, a nie tylko to, $PATHco działało dla mnie, ponieważ Twój system może różnić się od mojego. Ten proces powinien działać dla każdego.

$ 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>
Bruno Bronosky
źródło
10

Ten sam błąd

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'

i tutaj używam --userbez, sudoaby rozwiązać ten problem

$ 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 

Mam nadzieję, że pomoże to komuś, kto napotka podobny problem!

Idąc moją drogą
źródło
3
Nie powinieneś używać sudoz --user. To, co --userrobi, jest instalowane, ~/Librarya /Librarynie nie musisz go używać, sudoaby zainstalować tam. Ale po zainstalowaniu z programem sudowszystkie katalogi i pliki są własnością root. Następnie musisz sudozrobić z nimi cokolwiek innego. Co z kolei będzie wymagało użycia sudodo innych rzeczy, do których nie powinieneś go używać. Wtedy nawet uczciwy błąd może przejść od wyrzucenia błędu do zniszczenia danych.
Bruno Bronosky
9

Miałem te same problemy. Jak wspominali inni, nie uruchamiaj pip install z sudo. Biegać

brew doctor 

i napraw ostrzeżenia i powinieneś być w stanie kontynuować instalację pip.

apadana
źródło
6

Trudno jest zmusić pip do pracy na El Capitan z kilku powodów:

  1. OS X nie ustawia poprawnie niektórych zmiennych distutils, więc pip próbuje zainstalować pliki pomocnicze w lokalizacjach poniżej /System/Library/. El Capitan blokuje to, co jest błędem, na który napotykasz.
  2. OS X zawiera wiele nieaktualnych pakietów w ramach /System/Library/. pip często chce je ulepszyć, ale nie może tego zrobić w El Capitan.
  3. OS X umieszcza /System/Library/wyżej w kolejności wyszukiwania w Pythonie niż /Library/Python/2.7/site-packages(ogólnosystemowa lokalizacja pakietu pythona), więc nawet jeśli uda ci się zainstalować nowsze wersje niektórych pakietów, stare nadal są ładowane, łamiąc niektóre zależności.

Wszystkie te rozwiązania można obejść pod adresem https://apple.stackexchange.com/a/223163/143849 . Ale może najlepiej będzie, jeśli zainstalujesz własną wersję Pythona za pomocą standardowego instalatora Pythona, Homebrew lub Anaconda.

Matthias Fripp
źródło
4

Myślę, że masz jakiś konflikt z innym pakietem. Dla mnie to było six. Musisz więc użyć takiego polecenia:

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

lub

pip install --ignore-installed six

Ruhul Amin
źródło
3
Której części odpowiedzi udzielonej przez @MikkoOhtamaa nie rozumiesz, że nadal sugerujesz używanie sudo z pip ?
Piotr Dobrogost
@PiotrDobrogost, dlaczego nie przeczytasz poprawnie przed zapytaniem. Moja odpowiedź dotyczy six.
Ruhul Amin
3
Ponownie, której części odpowiedzi udzielonej przez @MikkoOhtamaa nie rozumiesz, że nadal sugerujesz używanie sudo z pip ?
Piotr Dobrogost
1

W pełni zgadzam się z Mikko, ale jeśli nadal chcesz to zrobić, oto sposób:

  • Uruchom ponownie w trybie odzyskiwania (przytrzymaj cmd + R)
  • Otwórz terminal z narzędzi
  • Użyj polecenia csrutil disable
gilliM
źródło
6
Może to być niebezpieczna rada bez wyjaśnienia konsekwencji wyłączenia Ochrony integralności systemu. Jedną z kwestii jest oczekiwanie, że nigdy nie będzie działać poprawnie, jeśli nie włączysz go ponownie stosunkowo szybko, podobnie jak UAC systemu Windows i wirtualizacja.
andy magoon
0

Mam python2.7 zainstalowany przez brew i następujące rozwiązania rozwiązały mój problem

napar zainstaluj numpy

Instaluje python3, ale nadal działa i konfiguruje go również dla wersji 2.7.

Aerodyno
źródło
Działał bez zarzutu. Dzięki!!
NightFury