installazione pip non riuscita con: OSError: [Errno 13] Autorizzazione negata sulla directory


123

pip install -r requirements.txtfallisce con l'eccezione di seguito OSError: [Errno 13] Permission denied: '/usr/local/lib/.... Cosa c'è che non va e come lo risolvo? (Sto provando a configurare Django )

Installing collected packages: amqp, anyjson, arrow, beautifulsoup4, billiard, boto, braintree, celery, cffi, cryptography, Django, django-bower, django-braces, django-celery, django-crispy-forms, django-debug-toolbar, django-disqus, django-embed-video, django-filter, django-merchant, django-pagination, django-payments, django-storages, django-vote, django-wysiwyg-redactor, easy-thumbnails, enum34, gnureadline, idna, ipaddress, ipython, kombu, mock, names, ndg-httpsclient, Pillow, pyasn1, pycparser, pycrypto, PyJWT, pyOpenSSL, python-dateutil, pytz, requests, six, sqlparse, stripe, suds-jurko
Cleaning up...
Exception:
Traceback (most recent call last):
  File "/usr/lib/python2.7/dist-packages/pip/basecommand.py", line 122, in main
    status = self.run(options, args)
  File "/usr/lib/python2.7/dist-packages/pip/commands/install.py", line 283, in run
    requirement_set.install(install_options, global_options, root=options.root_path)
  File "/usr/lib/python2.7/dist-packages/pip/req.py", line 1436, in install
    requirement.install(install_options, global_options, *args, **kwargs)
  File "/usr/lib/python2.7/dist-packages/pip/req.py", line 672, in install
    self.move_wheel_files(self.source_dir, root=root)
  File "/usr/lib/python2.7/dist-packages/pip/req.py", line 902, in move_wheel_files
    pycompile=self.pycompile,
  File "/usr/lib/python2.7/dist-packages/pip/wheel.py", line 206, in move_wheel_files
    clobber(source, lib_dir, True)
  File "/usr/lib/python2.7/dist-packages/pip/wheel.py", line 193, in clobber
    os.makedirs(destsubdir)
  File "/usr/lib/python2.7/os.py", line 157, in makedirs
    mkdir(name, mode)
OSError: [Errno 13] Permission denied: '/usr/local/lib/python2.7/dist-packages/amqp-1.4.6.dist-info'

Correlato (macOS / specifico per homebrew) stackoverflow.com/questions/33004708/…
wim

Risposte:


76

Opzione a) Crea un virtualenv, attivalo e installa:

virtualenv .venv
source .venv/bin/activate
pip install -r requirements.txt

Opzione b) Installa nella tua home directory:

pip install --user -r requirements.txt

La mia raccomandazione utilizza l'opzione safe (a), in modo che i requisiti di questo progetto non interferiscano con i requisiti di altri progetti.


2
Ho ricevuto un errore come questo sudo:pip: command not foundsulla mia istanza aws ec2 durante l'esecuzione di questo comando. Per favore aiuto.
user3768495

2
@ user3768495 Probabilmente pip non è installato per impostazione predefinita. Quale distro è la tua EC2? Inoltre, python2 potrebbe non essere installato, quindi installi python2 o utilizzi pip3. Stai attento con questo però.
hectorcanto

33
Ho letto che questo non è consigliato in più posti ora. Sembra che dovremmo
mettere in

3
@ JustusEapen: non so come mi sento al riguardo. Non penso che la risposta corretta alla domanda di OP sia un manuale sull'igiene di base del computer, incluso "non eseguire codice losco con i permessi di superutente" e "lavati i denti regolarmente". Trovo che la risposta ottimale dovrebbe sottolineare che i pacchetti possono essere installati su base utente o di sistema, e che l'installazione a livello di sistema, come desiderava OP (ci sono ragioni perfettamente cromulenti per farlo) richiede il permesso di un super utente. Mettere in guardia dall'installazione di pacchetti sul percorso di sistema è probabilmente compito di qualcun altro su qualche altra questione SO.
Tobia Tesan

8
downvoting a causa di sudoconsigli. anche se ora funziona, ti darà molti mal di testa in futuro.
Gerald

318

Dovremmo davvero smetterla di consigliare l'uso di sudocon pip install. È meglio provare prima pip install --user. Se questo fallisce, dai un'occhiata al post in alto qui .

Il motivo per cui non dovresti usare sudoè il seguente:

Quando esegui pip con sudo, esegui codice Python arbitrario da Internet come utente root, il che è un grosso rischio per la sicurezza. Se qualcuno inserisce un progetto dannoso su PyPI e lo installi, dai a un utente malintenzionato l'accesso root alla tua macchina.


5
Buona osservazione. Questo, dopotutto, vale per tutti sudo x install, per tutti x(compreso x = make).
Tobia Tesan

1
Questo ha anche risolto il mio problema. Cosa fa l'aggiunta di --user?
Miles Johnson

1
@MilesJohnson Adding --userinstalla il pacchetto nella tua home directory, invece che nella root. L'installazione di qualcosa in questa posizione non richiede privilegi aggiuntivi.
bert

1
Inoltre, se ti trovi su un server remoto dietro un proxy, "sudo" ti impedisce di recuperare i pacchetti da repository Internet e / o repository git della rete del server remoto.
Atassia

2
Ogni menzione è sudostata rimossa un anno fa. Questa risposta è obsoleta: modificala e aggiornala. È inoltre necessario menzionare le installazioni per utente rispetto a quelle a livello di sistema e le autorizzazioni. Non usare la tua risposta per criticare direttamente altre risposte, che tenderanno a diventare obsolete rapidamente.
smci

28

Stai tentando di installare un pacchetto nel percorso a livello di sistema senza avere l'autorizzazione per farlo.

  1. In generale, è possibile utilizzare sudoper ottenere temporaneamente i permessi di superutente sotto la propria responsabilità al fine di installare il pacchetto sul percorso a livello di sistema:

     sudo pip install -r requirements.txt

    Scopri di più sudo qui .

    In realtà, questa è una cattiva idea e non c'è un buon caso d'uso, vedi il commento di @ wim.

  2. Se non desideri apportare modifiche a livello di sistema, puoi installare il pacchetto sul percorso per utente utilizzando il --userflag.

    Tutto ciò che serve è:

     pip install --user runloop requirements.txt
  3. Infine, per un controllo ancora più dettagliato , puoi anche utilizzare un virtualenv , che potrebbe essere la soluzione migliore per un ambiente di sviluppo, soprattutto se stai lavorando su più progetti e desideri tenere traccia delle dipendenze di ciascuno.

    Dopo aver attivato il tuo virtualenv con

    $ my-virtualenv/bin/activate

    il seguente comando installerà il pacchetto all'interno di virtualenv (e non sul percorso a livello di sistema):

    pip install -r requirements.txt


4
L'esecuzione di pip con root comporta dei rischi per la sicurezza
Nrzonline

L'esecuzione di qualsiasi cosa che esegua codice da Internet come root comporta dei rischi per la sicurezza.
Tobia Tesan

Questa è quasi la risposta migliore, ma necessita comunque di un aggiornamento. a) Ora dobbiamo pyenv/pipenvmenzionare quelli, preferibilmente virtualenv(o conda-env) b) sudo considerato dannoso, e vedere le altre risposte perché. Quindi metti prima la risposta basata su env e quella sudo per ultima, con un grande disclaimer.
smci

1
sudo pip install -r requirements.txtnon è mai giusto. L'ambiente python del sistema appartiene al sistema, punto . Se si installa più roba di pitone nel sistema, farlo con gestore di pacchetti solo (ad esempio sudo yum install, apt-get, ecc ...) in quanto tali pronti contro termine dovrebbero avere versioni sicure e compatibili di librerie Disp.
wim

1
@TobiaTesan Il vecchio sudo make installcodice, solitamente compilato + collegato, non è proprio analogo a un sudo pip installpoiché l' installazione sul sistema di Python env può invalidare le dipendenze . Supponiamo che ci sia un servizio di sistema python-frobnicator, che ha una dipendenza da froblib(questo sarà anche nel gestore dei pacchetti e bloccato a una versione compatibile), e poi sudo pip installqualche altra app o libreria che ha una dipendenza da " froblib > 1.2". Pip "aggiornerà" felicemente la versione di sistema di froblibcon una più recente, che potrebbe essere incompatibile / non testata e rompere il sistema.
wim

26

Solo chiarendo cosa ha funzionato per me dopo tanto dolore in Linux (basato su Ubuntu) per errori di autorizzazione negata e sfruttando la risposta di Bert sopra, ora uso ...

$ pip install --user <package-name>

o se si esegue pip su un file dei requisiti ...

$ pip install --user -r requirements.txt

e funzionano in modo affidabile per ogni installazione di pip, inclusa la creazione di ambienti virtuali.

Tuttavia, la soluzione più pulita nella mia ulteriore esperienza è stata l'installazione python-virtualenve virtualenvwrappercon sudo apt-get installa livello di sistema.

Quindi, all'interno degli ambienti virtuali, utilizzare pip installsenza la --userbandiera E senza sudo. Molto più pulito, più sicuro e più facile nel complesso.


Ottengo un messaggio "Impossibile eseguire un'installazione" --user ". I pacchetti del sito utente non sono visibili in questo virtualenv." errore durante il tentativo di utilizzopip install --user -r requirements.txt
Amir A. Shabani

@ AmirA.Shabani la risposta è stata modificata dopo la tua domanda. Ora dice "all'interno degli ambienti virtuali, usa l'installazione pip senza il flag --user E senza sudo"
Daishi

7

L'utente non dispone dell'autorizzazione di scrittura per alcuni percorsi di installazione di Python. Puoi dare l'autorizzazione tramite:

sudo chown -R $USER /absolute/path/to/directory

Quindi dovresti dare il permesso, quindi provare a installarlo di nuovo, se hai nuovi percorsi dovresti anche dare il permesso:

sudo chown -R $USER /usr/local/lib/python2.7/

2
Per python installato con brew, questa è la risposta giusta perché brew mantiene i pacchetti come utente locale (senza root).
idbrii

9
chowning la directory / usr / local non è una buona idea. Non appartiene all'utente. Dovresti leggere informazioni sulla struttura dei file unix.
user8162

6
Le cose sotto /usrsarebbero in genere di proprietà di root, in questi giorni. Chowning ricorsivamente potrebbe rovinare il tuo sistema. EVITARE .
wim

0

Se hai bisogno di autorizzazioni, non puoi usare "pip" con "sudo". Puoi fare un trucco, in modo da poter usare 'sudo' e installare il pacchetto. Basta posizionare 'sudo python -m ...' davanti al comando pip.

sudo python -m pip install --user -r package_name

A me sembra a posto, ma potresti aggiungere qualche spiegazione.
pythonic833

-1

Quindi, ho ricevuto lo stesso errore esatto per un motivo completamente diverso. A causa di un bug Homebrew + pip totalmente separato, ma noto , avevo seguito questa soluzione alternativa elencata nella documentazione della guida di Google Cloud, dove crei un file .pydistutils.cfg nella tua home directory. Questo file ha una configurazione speciale che dovresti usare solo per l'installazione di determinate librerie. Avrei dovuto rimuovere quel file disutils.cfg dopo aver installato i pacchetti, ma mi sono dimenticato di farlo. Quindi la soluzione per me era in realtà solo ...

rm ~/.pydistutils.cfg.

E poi tutto ha funzionato normalmente. Ovviamente, se hai qualche configurazione in quel file per un motivo reale, allora non vorrai semplicemente rm quel file. Ma nel caso in cui qualcun altro abbia fatto quella soluzione alternativa e si fosse dimenticato di rimuovere quel file, questo ha funzionato per me!


-1

È dovuto un problema di autorizzazione,

sudo chown -R $USER /path to your python installed directory

l'impostazione predefinita sarebbe /usr/local/lib/python2.7/

o prova,

pip install --user -r package_name

e poi dì, pip install -r requirements.txtquesto verrà installato all'interno del tuo env

non dire, sudo pip install -r requirements.txtquesto verrà installato in un percorso python arbitrario.

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.