Questo problema si presenta spesso quando pip tenta di installare una manpage per IPython su El Capitan. La soluzione rapida è usare un comando pip come questo:
sudo -H pip install --install-option '--install-data=/usr/local' <package>
Tuttavia, System Integrity Protection (SIP) su El Capitan blocca diverse cattive pratiche con pip che era solito scorrere, quindi sarà probabilmente necessario apportare ulteriori modifiche per far funzionare senza problemi pip su El Capitan.
SIP su El Capitan espone tre problemi con l'utilizzo di pip con la versione di Python fornita da Apple su OS X:
distutils non imposta correttamente due variabili importanti su Mac, quindi pip prova a scrivere intestazioni e altri file condivisi (ad esempio manpage) in /System/Library/Frameworks/Python.framework/Versions/2.7/
. Questa è una cattiva idea, ma nelle versioni precedenti di OS X, ha avuto successo se pip è stato eseguito con sudo. Tuttavia fallisce su El Capitan a causa di SIP. Questo è l'errore che hai riscontrato. Dà messaggi comeOSError: [Errno: 1] Operation not permitted: '/System/Library/Frameworks/Python.framework/Versions/2.7/share'
Apple installa versioni obsolete di alcuni pacchetti in /System/Library/Frameworks/Python.framework/Versions/2.7/Extras/lib/python/
(ad esempio, sei). Nelle versioni precedenti di OS X, quando si installava un pacchetto che richiedeva una versione più recente di uno di questi, sudo pip
si rimuoveva automaticamente la versione precedente dalla /System/
cartella e si installava una versione più recente /Library/Python/2.7/site-packages
. Anche questa è stata una cattiva idea e non è più possibile con SIP. Ma ora pip si arresterà in modo anomalo con un messaggio di errore durante il tentativo di rimuovere il vecchio pacchetto. Anche quel messaggio lo è OSError: [Errno: 1]
, ma viene dopo un messaggio simile Uninstalling six-1.4.1:
. Vedi, ad esempio, https://github.com/pypa/pip/issues/3165 .
La versione Apple di Python aggiunge diverse directory nel /System/Library/Frameworks/Python.framework/Versions/2.7/
percorso di ricerca di Python sopra i percorsi di installazione del pacchetto standard accessibili all'utente. Quindi, se installi una versione più recente di un pacchetto altrove (ad es., sudo -H pip install --ignore-installed six
), Riceverai un messaggio che indica che l'installazione è riuscita, ma quando avvii Python otterrai la versione precedente /System/Library/Frameworks/Python.framework/Versions/2.7/Extras/lib/python/
. Ciò rende anche impossibile utilizzare nuovi pacchetti con lo stesso nome dei moduli della libreria standard.
Puoi aggirare questi problemi, ma il metodo dipende dalle tue risposte a tre domande.
- Vuoi continuare a utilizzare la versione di Python per Mac OS X o installarne una tua? L'installazione della tua è l'opzione più sicura e può essere eseguita tramite il programma di installazione ufficiale di Python, Homebrew o Anaconda. Questo è anche ciò che Apple consiglia , come sottolineato da @Sacrilicious . Se installi la tua versione di Python, probabilmente dovresti disinstallare tutto ciò che è attualmente installato
/Library/Python/2.7/site-packages
e tutti gli script installati /usr/local/bin
per quei pacchetti (incluso pip). Altrimenti avrai la fastidiosa esperienza di alcuni script che accedono alla versione di Python installata dal sistema e alcuni che accedono alla tua installazione.
Se vuoi restare con Python installato dal sistema, devi prendere altre due decisioni:
Vuoi installare pacchetti per tutti gli utenti o solo per te stesso? L'installazione per tutti gli utenti garantisce che ogni programma che utilizza Python (inclusi eventualmente gli script amministrativi) avrà accesso a tutti i pacchetti installati. Tuttavia, c'è una remota possibilità che interferisca con l'uso da parte di El Capitan di Python. (Spero che Apple utilizzi python -S
per assicurarsi che ottengano sempre i pacchetti che si aspettano, ma non ho modo di testarlo.) L'installazione solo per il tuo account utente elimina la possibilità di interferire con l'installazione di Python del sistema. Nota: se si passa da un'installazione a livello di sistema a solo utente, è consigliabile sfruttare questa possibilità per disinstallare tutto ciò che è attualmente installato /Library/Python/2.7/site-packages
e gli script correlati /usr/local/bin
.
Vuoi nascondere i pacchetti extra che sono installati con la versione OS X di Python (sotto /System/Library/Frameworks/Python.framework/Versions/2.7/Extras/lib/python/
) o tenerli nel percorso di ricerca? Consiglio di nasconderli, in modo che le versioni più recenti di questi pacchetti vengano installate automaticamente in posizioni accessibili all'utente quando necessario. Se non nascondi questa directory, a volte riceverai messaggi che pip non è stato in grado di rimuovere un pacchetto esistente per aggiornarlo a una versione successiva (necessario per un pacchetto diverso che stai installando). In tal caso, sarà necessario eseguire pip install --ignore-installed <package>
, che installerà la versione più recente e nasconderà la versione installata dal sistema. Tuttavia, se nascondi il tutto/System/.../Extras/...
directory, perderai l'accesso ad alcuni pacchetti Apple che non sono disponibili tramite pip, ad esempio CoreGraphics e bonjour. (Se hai bisogno di questi, potresti essere in grado di ottenere l'accesso collegandoli alla directory dei pacchetti del sito).
Ora, ecco le soluzioni alternative. Queste sarebbero buone pratiche su tutte le versioni di OS X, per evitare la sostituzione o la rimozione accidentale di pacchetti Python utilizzati dal sistema operativo; tuttavia sono essenziali se si desidera utilizzare i pacchetti installati dall'utente con la versione di Python fornita da Apple su OS X El Capitan (10.11).
Installa pip
Probabilmente lo hai già fatto, ma in caso contrario, puoi utilizzare il seguente comando per installare pip per tutti gli utenti :
sudo -H easy_install pip
# pip script will be installed in /usr/local/bin
Oppure usa questo comando per installare pip solo per il tuo account utente :
easy_install --user pip
# pip script will be installed in ~/Library/Python/2.7/bin
Gestisci percorsi file condivisi
Se stai installando pacchetti per tutti gli utenti, crea un file chiamato .pydistutils.cfg con queste righe (da https://github.com/pypa/pip/issues/426 ):
[install]
install-data=/usr/local
install-headers=/usr/local
Se si utilizza di solito sudo -H pip ...
, è necessario inserire questo file /var/root
(home directory per l'utente root). Se di solito lo usi sudo pip ...
, allora dovresti mettere questo file nella tua home directory (~).
Queste impostazioni impediranno a pip di provare a scrivere elementi condivisi come intestazioni e pagine man in /Library/System
. (Il comando nella parte superiore di questa risposta è una versione più veloce della stessa cosa.) Queste impostazioni sono necessarie perché il codice specifico di darwin /System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/distutils/command/install.py
non riesce a impostare queste variabili in posizioni scrivibili da root (sebbene imposta correttamente altre variabili). Ulteriori informazioni al riguardo sono disponibili su https://github.com/pypa/pip/issues/3177 .
Se installi pacchetti solo per il tuo account utente, gli elementi condivisi verranno automaticamente installati in ~/Library/Python/2.7/
. Ma dovresti aggiungere le seguenti righe al tuo ~ / .profile in modo che gli elementi condivisi vengano trovati quando ne hai bisogno:
export PATH=~/Library/Python/2.7/bin:$PATH
export MANPATH=~/Library/Python/2.7/share/man:$MANPATH
Nota: sarà necessario avviare una nuova shell o eseguirli sulla riga di comando affinché le modifiche abbiano effetto. Potresti anche voler eseguire hash -r
se hai rimosso di recente vecchi script dal percorso.
Gestisci percorso Python
Dovrai assicurarti che i pacchetti installati siano più alti nell'ordine di ricerca di Python rispetto ai pacchetti installati dal sistema. Il modo più semplice per farlo è con i .pth
file. Questo segue il suggerimento di @ Sacrilicious altrove in questa pagina , ma assicura che la directory dei pacchetti del sito dell'utente venga cercata prima della directory dei pacchetti del sito a livello di sistema, ed entrambi vengano cercati prima della libreria standard e della directory Extras di Apple (entrambe in / Sistema /. ..). /System/.../Extras
Se lo si desidera, si omette anche dal percorso di ricerca.
Crea un file chiamato fix_mac_path.pth
, con il testo seguente. Se si installano pacchetti per tutti gli utenti, fix_mac_path.pth
devono essere inseriti /Library/Python/2.7/site-packages
. Se stai installando solo per il tuo utente, fix_mac_path.pth
dovrebbe essere in ~ / Library / Python / 2.7 / lib / python / site-pacchetti. (Questo file può avere qualsiasi nome desiderato, ma deve essere posizionato in una o entrambe queste posizioni e deve terminare .pth
; inoltre, tutto il testo in questo file deve essere su una riga.)
Se vuoi nascondere i pacchetti installati da Apple in /System/.../Extras
:
Per prima cosa esegui uno dei seguenti comandi per ottenere una copia funzionante di pip / setuptools indipendente dalla versione fornita da Apple:
pip install --ignore-installed --user setuptools # your account only
# or
sudo -H pip install --ignore-installed setuptools # all users
Quindi inserire il seguente codice nella fix_mac_path.pth
posizione sopra specificata:
import sys; std_paths=[p for p in sys.path if p.startswith('/System/') and not '/Extras/' in p]; sys.path=[p for p in sys.path if not p.startswith('/System/')]+std_paths
Se si desidera continuare a utilizzare i pacchetti installati da Apple, non è necessario installare un'altra copia di setuptools. Basta inserire il seguente codice nella fix_mac_path.pth
posizione sopra specificata:
import sys; std_paths=[p for p in sys.path if p.startswith('/System/')]; sys.path=[p for p in sys.path if not p.startswith('/System/')]+std_paths
Successivamente, è possibile utilizzare python -m site
per assicurarsi che l'ordine di ricerca del percorso abbia senso.
Installa i pacchetti
Dopodiché, dovresti essere in grado di installare nuovi pacchetti usando uno dei seguenti comandi.
Per tutti gli utenti:
sudo -H pip install <package>
Per il tuo utente:
pip install --user <package>