OSX El Capitan: sudo pip install OSError: [Errno: 1] Operazione non consentita


127

Quando corro:

sudo pip install ipython

Ottengo il seguente errore

OSError: [Errno: 1] Operazione non consentita: '/System/Library/Frameworks/Python.framework/Versions/2.7/share'

L'ultimo comando eseguito tenta di creare la directory indicata sopra.

Inoltre, il seguente comando non riesce a installare iPython senza fornire errori.

sudo pip install --user python

(Sono su Mac OS X El Capitan nel caso in cui altre persone su questo SO vedano lo stesso problema.)



Ho aggiunto una risposta che spiega come modificare il tuo in $PATHmodo da poter chiamare gli eseguibili per i pacchetti --user installati. stackoverflow.com/a/47102398/117471
Bruno Bronosky

2
Non dovresti usare sudocon --user. Quello che --userfa è installare in ~/Librarypiuttosto che /Librarynon è necessario utilizzare sudoper installare lì. Ma una volta installato con sudo, le directory e i file sono tutti di proprietà di root. Quindi devi usare sudoper fare qualsiasi altra cosa per loro. Che a sua volta ti richiederà di usare sudoper altre cose per le quali non dovresti usarlo. Quindi anche un errore onesto può passare dal lanciare un errore alla distruzione dei dati.
Bruno Bronosky,

Risposte:


205

Le istruzioni fornite sudo pip installsono intrinsecamente errate.

Se c'è qualche tutorial là fuori che dice che dovresti fare, sudo pipti preghiamo di presentare un bug per questo pacchetto. L'autore sta diseducando la comunità di Python, poiché il tempo ha dimostrato sudo pipdi essere una pratica infranta.

OSX El Capitan ha introdotto un meccanismo per prevenire danni ai file del sistema operativo . /System/Library/Frameworks/Python.framework/Versions/2.7/shareè una delle posizioni protette. Un utente normale non ha motivo di inserire o scrivere file lì . Questo perché il sistema operativo stesso si basa su questi file e sudo pip, con tutta la forza data da quanto sopra, li sovrascriverà incondizionatamente. Di solito non accadono cose brutte, ma ci sono possibilità. Apple vuole proteggere i propri utenti del sistema operativo in modo da murare accidentalmente la loro installazione.

Invece, è necessario installare un pacchetto Python, come IPython, localmente nella cartella home dell'utente . Il modo più semplice è creare un ambiente virtuale , attivarlo ed eseguire pip nell'ambiente virtuale.

Esempio:

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

Ulteriori informazioni

In alternativa, si dovrebbe essere in grado di fare pip install --user. Ma ancora una volta, non è necessario il sudo ed è necessario impostare manualmente PATHla variabile di ambiente.


5
Se nessun virtualenv si desidera e si vuole a livello globale (ad esempio /Library/Python/2.7/site-packages) installare i moduli, provare la mia soluzione qui di seguito utilizzando easy_install stackoverflow.com/a/33463702/3078330
smat88dd

3
Hai una citazione per questa prospettiva sul fatto che 'sudo pip' sia un male ("come il tempo ha dimostrato che sudo pip è una pratica infranta")? Non vedo alcuna discussione su sudo nelle citazioni che dai e l'esercitazione elenca il primo passo per la creazione di virtualenv come 'pip install virtualenv' che sembra creare una dipendenza circolare cercando di seguire i tuoi consigli.
Dal

1
@Von: pip install virtualenvnon dovrebbe più essere necessario per Python 3.4+, in quanto vengono forniti con l' python -m venvequivalente virtualenv integrato . docs.python.org/3/library/venv.html
Mikko Ohtamaa,

29
Con tutto il rispetto, questo non affronta la domanda originale. Sto provando a installare IPython e renderlo disponibile a livello globale (per tutti gli utenti sulla mia macchina), né un virtual virtual né un pip install --user IPythonaiuto in tal senso. Inoltre, pip install --user IPythonnon riesce a inserire il ipythoncomando nel $PATH(almeno sulla mia macchina).
jpetazzo,

3
Mi hai insegnato e mi hai anche risparmiato tempo. Un grande ringraziamento ho smesso di usare sudo e tutto ha funzionato! Bella risposta.
Parth Gupta,

24

Ho avuto gli stessi problemi, ma usando easy_install "module"risolto il problema per me.

Non sono sicuro del perché, ma pip e easy_install utilizzano percorsi di installazione diversi e easy_install ha scelto quelli giusti.

Modifica: senza ricontrollare ma a causa dei commenti; sembra che installazioni diverse (OSX e installate in brew) interferiscano l'una con l'altra, motivo per cui gli strumenti citati in effetti puntano a posizioni diverse (poiché appartengono a installazioni diverse). Capisco che di solito quegli strumenti da un punto di installazione alla stessa cartella.


Hai due interpreti Python diversi installati ed easy_installè configurato per un altro?
Mikko Ohtamaa,

Devo 2-3 diverse versioni di Python installate, ma non ho easy_installper tutti loro: easy_install-2.6, easy_install-2.7,easy_install-3.5
smat88dd

Molto probabilmente pipe easy_installindicano diversi Python. Puoi capirlo con il whichcomando UNIX, quindi capire il pipcomando giusto da usare.
Mikko Ohtamaa,

1
Potrebbe essere prima dell'installazione dal vecchio OSX prima dell'aggiornamento?
Mikko Ohtamaa,

1
pip e easy_install utilizzano posizioni di installazione diverse - no, usano esattamente le stesse posizioni. Ha funzionato per caso mentre @MikkoOhtamaa stava cercando di mostrarti nei suoi commenti. Questa è chiaramente una non risposta.
Piotr Dobrogost,

19

Dovresti reinstallare Python:

brew reinstall python

Per ottenere la birra, consultare la homepage della birra .


Io secondo. corro, brew install pythonquindi penso che pipsia già a posto. Dopo che l' pipinstallazione ha funzionato (ho avuto problemi simili con permessi e pip pipailing su installazioni)
travelingbones,


11

Usato pip3 install <package>invece e risolto il problema di autorizzazione con pip.


10
Cordiali saluti, questo ha funzionato perché pip3utilizza Python 3, che di solito è installato dall'utente. Python 2 (2.7), invece, viene spedito con macOS ed è protetto come spiega la risposta più votata.
Khanh Nguyen l'

10

Correzione TL; DR $ PATH

  1. Utilizzare pip install --user package_nameper installare un pacchetto che dovrebbe includere eseguibili CLI.
  2. Avviare una shell Python e import package_name
  3. Trova dove si lib/python/...verifica nell'output e sostituisci tutto conbin
  4. È probabile che lo sia $HOME/Library/Python/2.7/bin

Dettagli

Grazie alla nuova protezione dell'integrità del sistema in macOS 10.11 El Capitan, non puoi più sudo pip install. Non discuteremo i meriti di questo qui.

Un'altra risposta spiega che dovresti avere pip install --userragione. Ma ti hanno inviato nei vicoli posteriori per capire cosa fare del tuo in $PATHmodo da poter accedere agli eseguibili installati. Fortunatamente, ho già risolto un bisogno simile di una domanda non correlata .

Ecco una trascrizione di come ho risolto il problema su uno dei miei sistemi. Sto includendo tutto piuttosto che quello $PATHche ha funzionato per me, perché il tuo sistema potrebbe essere diverso dal mio. Questo processo dovrebbe funzionare per tutti.

$ 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

Stesso errore

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'

e qui lo uso --usersenza sudoper risolvere questo problema

$ 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 

Spero che possa aiutare qualcuno che incontra problemi simili!


3
Non dovresti usare sudocon --user. Quello che --userfa è installare in ~/Librarypiuttosto che /Librarynon è necessario utilizzare sudoper installare lì. Ma una volta installato con sudo, le directory e i file sono tutti di proprietà di root. Quindi devi usare sudoper fare qualsiasi altra cosa per loro. Che a sua volta ti richiederà di usare sudoper altre cose per le quali non dovresti usarlo. Quindi anche un errore onesto può passare dal lanciare un errore alla distruzione dei dati.
Bruno Bronosky,

9

Ho avuto gli stessi problemi. Come altri hanno già detto, non eseguire pip install con sudo. Correre

brew doctor 

e correggi gli avvisi e dovresti essere in grado di procedere con l'installazione del pip.


6

È difficile far funzionare pip su El Capitan per diversi motivi:

  1. OS X non imposta correttamente alcune variabili distutils, quindi pip tenta di installare file ausiliari in posizioni sotto /System/Library/. El Capitan lo blocca, che è l'errore in cui ti imbatti.
  2. OS X include un numero di pacchetti obsoleti in /System/Library/. pip spesso vuole aggiornarli ma non può su El Capitan.
  3. OS X si colloca /System/Library/più in alto nell'ordine di ricerca di Python rispetto a /Library/Python/2.7/site-packages(la posizione del pacchetto python a livello di sistema), quindi anche se riesci a installare versioni più recenti di alcuni pacchetti, quelli vecchi vengono comunque caricati, interrompendo alcune dipendenze.

Esistono soluzioni alternative per tutti questi su https://apple.stackexchange.com/a/223163/143849 . Ma potresti essere meglio installare la tua versione di Python tramite il programma di installazione standard di Python, Homebrew o Anaconda.


4

Immagino che tu abbia qualche conflitto con altri pacchetti. Per me lo è stato six. Quindi è necessario utilizzare un comando come questo:

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

o

pip install --ignore-installed six


3
Quale parte della risposta data da @MikkoOhtamaa non capisci che suggerisci ancora di usare sudo con pip ?
Piotr Dobrogost,

@PiotrDobrogost, perché non leggi correttamente prima di chiedere. La mia risposta è riguardo six.
Ruhul Amin,

3
Ancora una volta, quale parte della risposta data da @MikkoOhtamaa non capisci che suggerisci ancora di usare sudo con pip ?
Piotr Dobrogost,

1

Sono pienamente d'accordo con Mikko, ma se vuoi ancora farlo, ecco il modo:

  • Riavvia in modalità di ripristino (tieni premuto cmd + R)
  • Aprire il terminale dalle utility
  • Usa il comando csrutil disable

6
Questo potrebbe essere un consiglio pericoloso senza spiegare le implicazioni della disabilitazione di System Integrity Protection. Una considerazione è l'aspettativa che non funzionerà mai più correttamente se non lo riattivi relativamente rapidamente, proprio come UAC di Windows e Virtualizzazione.
Andy Magoon,

0

Ho installato python2.7 tramite brew e il seguente ha risolto il mio problema

brew install numpy

Installa python3, ma funziona ancora e lo imposta anche per 2.7.


Ha funzionato perfettamente. Grazie!!
NightFury
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.