È accettabile e sicuro eseguire pip install sotto sudo?


114

Ho iniziato a utilizzare il mio Mac per installare i pacchetti Python nello stesso modo in cui faccio con il mio PC Windows al lavoro; tuttavia sul mio Mac ho riscontrato frequenti errori di autorizzazione negata durante la scrittura su file di registro o pacchetti del sito.

Pertanto ho pensato di eseguire pip install <package>sotto, sudoma è un uso sicuro / accettabile di sudo considerando che voglio solo che venga installato nel mio account utente corrente?

Esempio di traceback da un errore di I / O del file di log:

Command /usr/bin/python -c "import setuptools;__file__='/Users/markwalker/build/pycrypto/setup.py';exec(compile(open(__file__).read().replace('\r\n', '\n'), __file__, 'exec'))" install --single-version-externally-managed --record /var/folders/tq/hy1fz_4j27v6rstzzw4vymnr0000gp/T/pip-k6f2FU-record/install-record.txt failed with error code 1 in /Users/markwalker/build/pycrypto
Storing complete log in /Users/markwalker/Library/Logs/pip.log
Traceback (most recent call last):
  File "/usr/local/bin/pip", line 8, in <module>
    load_entry_point('pip==1.1', 'console_scripts', 'pip')()
  File "/Library/Python/2.7/site-packages/pip-1.1-py2.7.egg/pip/__init__.py", line 116, in main
    return command.main(args[1:], options)
  File "/Library/Python/2.7/site-packages/pip-1.1-py2.7.egg/pip/basecommand.py", line 141, in main
    log_fp = open_logfile(log_fn, 'w')
  File "/Library/Python/2.7/site-packages/pip-1.1-py2.7.egg/pip/basecommand.py", line 168, in open_logfile
    log_fp = open(filename, mode)
IOError: [Errno 13] Permission denied: '/Users/markwalker/Library/Logs/pip.log'

Aggiorna Probabilmente dipendeva dalle autorizzazioni, tuttavia l'approccio migliore è usare ambienti virtuali per i tuoi progetti Python. La corsa sudo pipdovrebbe essere evitata a meno che non sia assolutamente necessario.


12
Trovo che " cd /tmp; sudo pip install foo" sia una soluzione alternativa adeguata.
Brian Cain


@pradyunsg perché segnalare una domanda così vecchia?
markwalker_

3
In sostanza, l'attuale risposta accettata (e l'aggiornamento nella domanda) suggerisce di eseguire "sudo pip" - qualcosa che i manutentori di pip (io stesso essendo uno di loro) stanno attivamente dicendo alle persone di non fare poiché ciò può comportare la rottura del sistema operativo su MacOS e molte (tutte?) principali distribuzioni Linux. Sono atterrato qui mentre utilizzavo termini che qualcuno potrebbe eseguire il debug della loro situazione e volevo solo che questo reindirizzasse le persone a una posizione con consigli migliori. Non ho pensato di portare effettivamente questa domanda e la risposta è migliore in linea con l'affermazione di cui sopra. (senza caratteri)
pradyunsg

@markwalker_ saresti disposto a rimuovere quel consiglio dalla domanda e possibilmente sostituirlo con un consiglio migliore (usando --user o virtualenv)?
pradyunsg

Risposte:


105

Usa un ambiente virtuale :

$ virtualenv myenv
.. some output ..
$ source myenv/bin/activate
(myenv) $ pip install what-i-want

Utilizzi sudoo permessi elevati solo quando desideri installare materiale per l'installazione Python globale a livello di sistema.

È meglio usare un ambiente virtuale che isola i pacchetti per te. In questo modo puoi giocare senza inquinare l'installazione globale di Python.

Come bonus, virtualenv non necessita di autorizzazioni elevate.


2
Se i suoi permessi sono incasinati per la sua directory home , è improbabile che l'uso di virtualenv lo aiuti
hd1

1
Sì, lo farà, ma è già successo, quindi deve aggiustarlo prima di continuare.
hd1

1
Grazie ragazzi, ho letto di virtualenv prima, quindi spero che queste due soluzioni insieme mi riporteranno in pista :)
markwalker_

1
inoltre, per installare virtualenv è necessario sudo ... o c'è una soluzione alternativa?
jimijazz

8
Non capisco perché questa sia la risposta migliore. La domanda NON riguarda gli ambienti virtuali. Riguarda la validità dell'uso sudo pip install. Diciamo che devo installare qualche pacchetto che userò in molti progetti oa livello di sistema. Come alcuni strumenti CLI come pgcli. Ovviamente non ho bisogno di un ambiente virtuale per questo, voglio installarlo globalmente. Devo usare sudo pip installo ci sono alcune pratiche più corrette? Questa è la domanda.
Alex Belyaev

42

È accettabile e sicuro correre pip installsotto sudo?

Non è sicuro ed è disapprovato - vedi Quali sono i rischi di eseguire "sudo pip"? Per installare il pacchetto Python nella tua home directory non hai bisogno dei privilegi di root. Vedi descrizione di --useropzione per pip.


Sebbene la tua soluzione sia stata la prima che ha effettivamente funzionato, @throws_exceptions_at_you ha creato una risposta con il codice effettivo e non un reindirizzamento alla documentazione
Edenshaw

Non sudo pip installconoscevo i danni derivanti dall'uso. Come posso annullare questo comando o bloccare l'esecuzione sudo?
Emre Değirmenci

26

Il tuo problema originale è che pip non può scrivere i log nella cartella.

IOError: [Errno 13] Permission denied: '/Users/markwalker/Library/Logs/pip.log'

Hai bisogno di cd in una cartella in cui il processo invocato può scrivere in questo /tmpmodo cd /tmpe invocare nuovamente il comando probabilmente funzionerà ma non è quello che vuoi.

MA in realtà per questo caso particolare (non si desidera utilizzare sudoper l'installazione di pacchetti Python) e non è necessario installare pacchetti globali, è possibile utilizzare il --userflag in questo modo:

pip install --user <packagename>

e funzionerà benissimo.

Presumo che tu abbia un'installazione di python python per un utente e non vuoi perdere tempo con la lettura di virtualenv (che non è molto userfriendly) o pipenv .

Come alcune persone nella sezione commenti hanno sottolineato il prossimo approccio non è una buona idea a meno che tu non sappia cosa fare e rimanga bloccato:

Un altro approccio per i pacchetti globali come nel tuo caso vuoi fare qualcosa come:

chown -R $USER /Library/Python/2.7/site-packages/

o più in generale

chown -R $USER <path to your global pip packages>

9
-1 Cambiare la proprietà della cartella globale dei pacchetti del sito è una cosa terribile da fare. L' --useropzione per pip è stata data come soluzione nella mia risposta che esisteva già quando hai scritto la tua.
Piotr Dobrogost

1
Non vedo un argomento qui. Dato anche il fatto che qualcuno che fa una domanda di questo tipo probabilmente non ha familiarità con il sistema di autorizzazione di unix e quindi eseguire un'installazione da 1 utente non ha importanza. Inoltre la tua risposta in realtà non riesce ad affrontare il caso d'uso di me che VOGLIO effettivamente installare su pacchetti globali. Dopo averlo fatto, potrei facilmente ripristinare le autorizzazioni alla preinstallazione.
throws_exceptions_at_you

2
+1 per scrivere effettivamente tutti i comandi. Alcune persone presumono che l'OP sappia come implementare un'opzione sulla riga di comando quando loro, o altri lettori, potrebbero non farlo. Non sei d'accordo, @PiotrDobrogost?
Let Me Tink About It

l'aggiunta --usermi aiuta!
Honghao Zhang

2
Cambiare i permessi per l'intera site-packagesdirectory del sistema Python è come "riparare" una pompa colpendola con una chiave inglese. È protetto per un motivo: non dovresti installare roba lì . La vera soluzione è non mescolare la distribuzione Python del sistema con la programmazione quotidiana. Installa una diversa distribuzione Python (da Python.org, Homebrew, Canopy, ecc.).
charlesreid1

9

Poiché ho avuto lo stesso problema, voglio sottolineare che in realtà il primo commento di Brian Cain è la soluzione al problema "IOError: [Errno 13]":

Se eseguito nella directory temp ( cd /tmp), IOError non si verifica più se eseguo sudo pip install foo.


2
C'è qualche possibilità che puoi spiegare perché questo risolve il problema per te?
Chris

8
stai ancora utilizzando sudo pipquesta "soluzione" e quindi installando pacchetti con privilegi di root, che probabilmente non è quello che vuoi?
Chris

Posso solo indovinare il motivo per cui funziona: penso che alcune parti di (alcuni) script di installazione di pip richiedano l'accesso in scrittura alla directory corrente, ma con un utente diverso. Pertanto, se eseguito mentre ci si trova nella directory home, fallisce misteriosamente a causa della mancanza di accesso in scrittura. Se chiamato dall'interno /tmpfunziona, perché tutti hanno accesso in scrittura lì.
Edgar

Non ha accesso in scrittura a "/Users/markwalker/Library/Logs/pip.log"
throws_exceptions_at_you

5

Ho avuto un problema durante l'installazione virtualenvwrapperdopo l'installazione con successo virtualenv.

Il mio terminale si è lamentato dopo averlo fatto:

pip install virtualenvwrapper

Quindi, ho provato senza successo questo (NON RACCOMANDATO) :

sudo pip install virtualenvwrapper

Quindi, l'ho installato con successo con questo:

pip install --user virtualenvwrapper

L'opzione --user per pip è stata data come soluzione nella mia risposta che esisteva già quando hai scritto la tua. Questo avrebbe dovuto essere un commento, non una risposta.
Piotr Dobrogost

dici NON consigliato ma le note di installazione ufficiali dicono OK per installare virtualenvwrapper con sudo. Lo stesso vale per virtualenv. La domanda qui posta non fa riferimento a questi due, quindi presumo che tutte le altre risposte qui siano per pacchetti python generali.
mehmet

Per i futuri lettori, ho barrato il flag "sconsigliato" nella mia risposta a causa del commento sopra ma non l'ho ancora verificato. Ecco perché non ho ancora cancellato il flag.
Let Me Tink About It

4

Sembra che le tue autorizzazioni siano sbagliate. Digita chown -R markwalker ~il Terminale e riprova pip? Fammi sapere se hai risolto.


Sebbene questo possa risolvere il problema delle autorizzazioni, non risponde alla domanda.
Burhan Khalid

1
Risolvere problemi che non sapevo di avere è un bonus! chownsta dando Operation not permittedmolte directory nascoste come .shshe presumo stia lavorando su file che può impostare ora, ma vedrò cosa succede quando ritorna il prompt cli.
markwalker_
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.