Come evitare "Permission denied" quando si utilizza pip con virtualenv


93

Tento di distribuire un pacchetto Python con pipin un ambiente virtuale su una macchina Ubuntu, ma riscontro un problema relativo alle autorizzazioni. Per esempio:

(TestVirtualEnv)test@testServer:~$ pip install markdown2

termina per:

errore: impossibile creare "/home/test/virtualenvs/TestVirtualEnv/lib/python3.3/site-packages/markdown2.py": autorizzazione negata

Non posso sudo, poiché installerà il pacchetto a livello globale e non all'interno dell'ambiente virtuale. Io chowned site-packages; lsmostra solo le directory relative a easy_install, pipe setuptools, e nulla relativo a Markdown.

Come distribuire un pacchetto in un ambiente virtuale pipsenza riscontrare errori relativi alle autorizzazioni?


Giusto per chiarire: hai creato questo virtualenv con sudo?
sebastian_oe

@sebastian_oe: credo di averlo fatto. Ne ricrea uno per esserne sicuro.
Arseni Mourzenko

4
Allora questo potrebbe essere il problema. Prova a creare un virtualenv senza sudo.
sebastian_oe

1
@sebastian_oe: ho creato un ambiente virtuale senza sudo. In effetti, il pacchetto si installa correttamente ora. Per favore, puoi promuovere il tuo commento in una risposta in modo che io possa accettarlo?
Arseni Mourzenko

1
Inoltre, se stai passando da un utente all'altro , assicurati di utilizzare l'utente che possiede (o ha accesso in scrittura) alla virtualenvdirectory, perché puoi attivarlo virtualenvcon un altro utente, ma non ti consentirà di installare alcun pacchetto e darà il permesso di accesso.
Andrius

Risposte:


106

virtualenvpotrebbero verificarsi problemi di autorizzazione quando si crea l' virtualenvas sudoe quindi si opera senza sudoin virtualenv.

Come scoperto nel commento alla tua domanda, la soluzione qui è creare il virtualenvsenza sudoper poter lavorare (specialmente scrivere) in esso senza sudo.


4
se voglio crearlo in / opt che richiede sudo, penso che virtualenv non si installerà senza sudo.
Umair A.

7
@sebastian_oe Penso di amarti
Nobbynob Littlun

5
Come creare il virtualenvsenza sudo?
Tunn

Se hai creato il virtualenv con sudo, vedi la risposta di @vingtoft per come risolverlo facilmente senza ricrearlo
David A

103

Soluzione:

Se hai creato virtualenv come root, esegui il seguente comando:

sudo chown -R your_username:your_username path/to/virtuaelenv/

Questo probabilmente risolverà il tuo problema.

Saluti


1
Questo ha funzionato per me (chown /usr/local/lib/python3.4), tranne per il fatto che non credo di aver creato un virtualenv come root, in realtà avevo installato Python3.4 come root. Sto ancora testando, ma pensi che incorrerò in altri problemi con questa soluzione o questo chown risolverà la maggior parte degli errori?
ntk4

3
Come fai a scoprire se hai creato virtualenv o python come root?
A__

6

Nel mio caso, stavo usando mkvirtualenv, ma non ho detto che avrei usato python3. Ho ricevuto questo errore:

mkvirtualenv hug
pip3 install hug -U

....
error: could not create '/usr/lib/python3.4/site-packages': Permission denied

Ha funzionato dopo aver specificato python3:

mkvirtualenv --python=/usr/bin/python3 hug
pip3 install hug -U

5

Non ho creato il mio virtualenv usando sudo. Quindi la risposta di Sebastian non si applicava a me. Il mio progetto si chiama utils. Ho controllato la utilsdirectory e ho visto questo:

-rw-r--r--   1 macuser  staff   983  6 Jan 15:17 README.md
drwxr-xr-x   6 root     staff   204  6 Jan 14:36 utils.egg-info
-rw-r--r--   1 macuser  staff    31  6 Jan 15:09 requirements.txt

Come puoi vedere, utils.egg-infoè di proprietà di rootno macuser. Ecco perché mi dava un permission deniederrore. Ho anche dovuto rimuovere anche /Users/macuser/.virtualenvs/armoury/lib/python2.7/site-packages/utils.egg-linkperché è stato creato da root. L'ho fatto di pip install -e .nuovo dopo aver rimosso quelli, e ha funzionato.


3

Se hai creato l'ambiente virtuale usando root, usa questo comando

sudo su

ti darà l'accesso come root e quindi attiverà il tuo ambiente virtuale usando questo

source /root/.env/ENV_NAME/bin/activate

1

Non hai attivato l'ambiente virtuale prima di utilizzare pip.

Provalo con:

$(your venv path) . bin/activate

Quindi usa pip -r requirements.txt nella tua cartella principale


1

Ho anche avuto questo (per caso) dopo aver creato un nuovo venv mentre ero all'interno di un ambiente virtuale esistente. un modo semplice per diagnosticare questo sarebbe vedere dove pythonè collegato il simbolo, ad esempio eseguire:

ls -l venv/bin/python

e assicurati che punti al binario Python appropriato. Per la maggior parte dei sistemi questo sarà /usr/bin/pythono /usr/bin/python3. mentre se punta a un ambiente virtuale esistente sarà qualcosa di simile /home/youruser/somedir/bin/python. se si tratta di quest'ultimo, suggerirei di ricreare il venv assicurandomi di non essere "dentro" nessun virtualenv esistente (cioè eseguire deactivate)


pubblicato qui perché è una domanda popolare che menziona le parole chiave appropriate, quindi è più probabile che venga trovata e sia utile ad altre persone
Sam Mason

0

Durante la creazione di virtualenv se usi sudo, la directory viene creata con i privilegi di root, quindi quando provi a installare un pacchetto con un utente non sudo non avrai il permesso di installarvi. Quindi crea sempre virtualenv senza sudo e installa senza sudo.

Puoi anche copiare i pacchetti installati su global python su virtualenv.

cp -r /lib/python/site-packages/* virtualenv/lib/python/site-packages/

Non era questo il problema: se leggi i commenti, l'OP aveva creato l'env virtuale con sudo in primo luogo.
NickD
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.