Skip to content

Apple - Come utilizzare pip dopo l'aggiornamento di OS X El Capitan?

Ciao utente del nostro sito web, abbiamo trovato la risposta a quello che stavi cercando, scorri e la troverai qui sotto.

Soluzione:

Una soluzione rapida è quella di usare homebrew per installare python in /usr/local/bin in modo che il vostro pip possa essere eseguito con un framework python modificabile dall'utente.

brew install python
pip --version

Disabilitare la protezione dell'integrità del sistema è un'altra opzione, ma non la consiglio se non per i server gestiti professionalmente e protetti da fire wall, dove si ha la manodopera per gestire il rilevamento delle intrusioni o se si è uno sviluppatore/sysadmin e si ha bisogno di testare le cose con e senza SIP.

ls -lO /System/Library/Frameworks/Python.framework/Versions/2.7/
csrutil status

Si noterà che l'opzione ristretto che non può essere rimosso nemmeno come root mentre il SIP è attivo.

L'uso di homebrew permette di gestire pip e python separatamente dalla versione fornita dal sistema. Come bonus, il framework homebrew è progettato per facilitare la manutenzione e le patch/chores tramite l'automazione.

Un'altra opzione praticabile, che non richiede la disabilitazione di SIP o l'installazione di altre versioni di Python, è quella di installare i moduli solo per l'utente corrente usando

pip install --user 

Se si tratta solo della propria macchina personale, questa sarebbe la soluzione più semplice e sicura.

Questo problema si presenta spesso quando pip tenta di installare una pagina man per IPython su El Capitan. La soluzione rapida è usare un comando pip come questo:

sudo -H pip install --install-option '--install-data=/usr/local' 

Tuttavia, la protezione dell'integrità del sistema (SIP) su El Capitan blocca diverse cattive pratiche con pip che in passato erano state introdotte, quindi probabilmente sarà necessario apportare altre modifiche per far funzionare pip senza problemi su El Capitan.

SIP su El Capitan espone tre problemi nell'uso di pip con la versione di Python fornita da Apple su OS X:

  1. distutils non imposta correttamente due variabili importanti sui Mac, per cui pip cerca di scrivere header e altri file condivisi (ad esempio, le pagine man) sotto la voce /System/Library/Frameworks/Python.framework/Versions/2.7/. Questa è una cattiva idea, ma nelle versioni precedenti di OS X riusciva se pip veniva eseguito con sudo. Tuttavia, su El Capitan non funziona a causa di SIP. Questo è l'errore in cui ci si è imbattuti. Dà messaggi come OSError: [Errno: 1] Operation not permitted: '/System/Library/Frameworks/Python.framework/Versions/2.7/share'

  2. Apple installa versioni non aggiornate 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 rimuoveva silenziosamente la vecchia versione dalla cartella /System/ e installava una versione più recente in /Library/Python/2.7/site-packages. Anche questa era una cattiva idea e non è più possibile con SIP. Ma ora pip si blocca con un messaggio di errore quando si cerca di rimuovere il vecchio pacchetto. Questo messaggio è anche OSError: [Errno: 1]ma viene dopo un messaggio come Uninstalling six-1.4.1:. Si veda, ad esempio, https://github.com/pypa/pip/issues/3165 .

  3. La versione Apple di Python aggiunge diverse directory sotto la voce /System/Library/Frameworks/Python.framework/Versions/2.7/ al percorso di ricerca di Python sopra le posizioni standard di installazione dei pacchetti accessibili all'utente. Quindi, se si installa una versione più recente di un pacchetto altrove (ad esempio, sudo -H pip install --ignore-installed six), si otterrà un messaggio che indica che l'installazione è riuscita, ma poi quando si esegue python si otterrà la versione più vecchia da /System/Library/Frameworks/Python.framework/Versions/2.7/Extras/lib/python/. Questo rende impossibile utilizzare nuovi pacchetti che hanno lo stesso nome di moduli della libreria standard.

È possibile aggirare questi problemi, ma il metodo dipende dalle risposte a tre domande.

  1. Si vuole continuare a usare la versione di Python per Mac OS X o installare la propria? Installare la propria versione è l'opzione più sicura e può essere effettuata tramite l'installatore ufficiale di Python, Homebrew o Anaconda. Questo è anche ciò che Apple raccomanda, come sottolineato da @Sacrilicious. Se si installa una propria versione di Python, probabilmente si dovrebbe disinstallare tutto ciò che è attualmente installato in /Library/Python/2.7/site-packages e tutti gli script installati in /usr/local/bin per quei pacchetti (incluso pip). Altrimenti si avrà la fastidiosa esperienza di alcuni script che accedono alla versione di Python installata nel sistema e di altri che accedono alla propria installazione.

Se si vuole mantenere Python installato nel sistema, si devono prendere altre due decisioni:

  1. Volete installare i pacchetti per tutti gli utenti o solo per voi stessi? L'installazione per tutti gli utenti assicura che ogni programma che utilizza Python (compresi eventualmente gli script amministrativi) abbia accesso a tutti i pacchetti installati. Tuttavia, c'è una remota possibilità che interferisca con l'uso di Python da parte di El Capitan. (Spero che Apple utilizzi python -S per assicurarsi di ottenere sempre i pacchetti previsti, ma non ho modo di verificarlo). L'installazione solo per il proprio account utente elimina la possibilità di interferire con l'installazione di Python del sistema. Nota: se si intende passare dall'installazione a livello di sistema a quella solo per l'utente, probabilmente si dovrebbe cogliere l'occasione per disinstallare tutto ciò che è attualmente installato in /Library/Python/2.7/site-packages e i relativi script in /usr/local/bin.

  2. Si vogliono nascondere i pacchetti extra che vengono 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 nasconderle, in modo che le versioni più recenti di questi pacchetti vengano automaticamente installate in posizioni accessibili all'utente quando necessario. Se non si nasconde questa directory, occasionalmente si riceveranno messaggi che indicano che pip non è riuscito a rimuovere un pacchetto esistente per aggiornarlo a una versione successiva (necessaria per un altro pacchetto che si sta installando). In questo caso, è necessario eseguire pip install --ignore-installed che installerà la versione più recente e nasconderà la versione installata nel sistema. Tuttavia, se si nasconde l'intero pacchetto /System/.../Extras/... si perderà l'accesso ad alcuni pacchetti Apple che non sono disponibili tramite pip, come CoreGraphics e bonjour. (Se si ha bisogno di questi pacchetti, si può ottenere l'accesso con un link simbolico nella cartella site-packages).

Ora, ecco le soluzioni. Questi sarebbero una buona pratica su tutte le versioni di OS X, per evitare di sostituire o rimuovere accidentalmente i pacchetti Python usati dal sistema operativo; tuttavia sono essenziali se si vogliono usare i pacchetti installati dall'utente con la versione di Python fornita da Apple su OS X El Capitan (10.11).

Installare pip

Probabilmente lo avete già fatto, ma se non lo avete fatto, potete usare 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 usare questo comando per installare pip solo per il proprio account utente:

easy_install --user pip
# pip script will be installed in ~/Library/Python/2.7/bin

Gestire le posizioni dei file condivisi

Se state installando i pacchetti per tutti gli utenti, create 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 di solito si usa sudo -H pip ..., allora dovreste mettere questo file in /var/root (directory home dell'utente root). Se di solito si usa sudo pip ..., allora si dovrebbe mettere questo file nella propria home directory (~).

Queste impostazioni impediscono a pip di tentare di scrivere elementi condivisi come header e manpages sotto la directory /Library/System. (Il comando all'inizio di questa risposta è una versione più rapida della stessa cosa). Queste impostazioni sono necessarie perché il codice specifico di darwin in /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 (anche se imposta correttamente altre variabili). Maggiori informazioni su questo punto sono disponibili su https://github.com/pypa/pip/issues/3177.

Se si installano pacchetti solo per il proprio account utente, gli elementi condivisi saranno automaticamente installati sotto ~/Library/Python/2.7/. Ma dovreste aggiungere le seguenti righe al vostro ~/.profile in modo da trovare gli elementi condivisi quando ne avete bisogno:

export PATH=~/Library/Python/2.7/bin:$PATH
export MANPATH=~/Library/Python/2.7/share/man:$MANPATH

Nota: per rendere effettive le modifiche, è necessario avviare una nuova shell o eseguirle alla riga di comando. Si consiglia di eseguire anche hash -r se avete recentemente rimosso vecchi script dal percorso.

Gestione del percorso di Python

È necessario assicurarsi che i pacchetti installati siano più in alto nell'ordine di ricerca di Python rispetto ai pacchetti installati nel sistema. Il modo più semplice per farlo è con .pth file. Questo segue il suggerimento di @Sacrilicious in un'altra parte di questa pagina, ma assicura che la directory site-packages dell'utente venga cercata prima della directory site-packages del sistema ed entrambe vengano cercate prima della libreria standard e della directory Extras di Apple (entrambe sotto /System/...). Inoltre, omette /System/.../Extras dal percorso di ricerca, se lo si desidera.

Crea un file chiamato fix_mac_path.pthcon il testo sottostante. Se state installando i pacchetti per tutti gli utenti,fix_mac_path.pth dovrebbe essere inserito in /Library/Python/2.7/site-packages. Se si sta installando solo per il proprio utente,fix_mac_path.pth dovrebbe essere in ~/Library/Python/2.7/lib/python/site-packages. (Questo file può avere qualsiasi nome, ma deve essere collocato in una o entrambe le posizioni e deve terminare con .pthe deve terminare con .pth; inoltre, tutto il testo di questo file deve essere su una riga).

Se si vogliono nascondere i pacchetti installati da Apple in /System/.../Extras:

Eseguite prima 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 in fix_mac_path.pth nella posizione specificata sopra:

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 vuole continuare a usare i pacchetti installati da Apple, non è necessario installare un'altra copia di setuptools. Basta inserire il seguente codice in fix_mac_path.pth nella posizione specificata sopra:

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

Dopodiché, si può usare python -m site per assicurarsi che l'ordine di ricerca dei percorsi abbia senso.

Installare i pacchetti

Dopo questa operazione, dovreste essere in grado di installare nuovi pacchetti usando uno dei seguenti comandi.

Per tutti gli utenti:

sudo -H pip install 

Per il proprio utente:

pip install --user 

Feedback e valutazioni del tutorial

Non dimenticare di condividere questo tutorial se ha risolto il tuo problema.



Utilizzate il nostro motore di ricerca

Ricerca
Generic filters

Lascia un commento

Il tuo indirizzo email non sarà pubblicato.