Comment éviter «Autorisation refusée» lors de l'utilisation de pip avec virtualenv

93

J'essaie de déployer un package Python pipdans un environnement virtuel sur une machine Ubuntu, mais je rencontre un problème lié aux autorisations. Par exemple:

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

se termine par:

erreur: impossible de créer «/home/test/virtualenvs/TestVirtualEnv/lib/python3.3/site-packages/markdown2.py»: autorisation refusée

Je ne peux pas sudo, car il installera le package globalement, et non dans l'environnement virtuel. I chowned site-packages; lsmontre uniquement les répertoires liés à easy_install, pipet setuptools, et rien liés à Markdown.

Comment déployer un package dans un environnement virtuel pipsans rencontrer d'erreurs liées aux autorisations?

Arseni Mourzenko
la source
Juste pour clarifier: avez-vous créé cette virtualenv avec sudo?
sebastian_oe
@sebastian_oe: Je pense que oui . Je vais en recréer un pour être sûr.
Arseni Mourzenko
4
Alors cela pourrait être le problème. Essayez de créer une virtualenv sans sudo.
sebastian_oe
1
@sebastian_oe: J'ai créé un environnement virtuel sans sudo. En effet, le package s'installe correctement maintenant. S'il vous plaît, pouvez-vous promouvoir votre commentaire en réponse afin que je puisse l'accepter?
Arseni Mourzenko
1
De plus, si vous basculez entre différents utilisateurs, assurez-vous que vous utilisez un utilisateur qui possède (ou qui a un accès en écriture) virtualenv, car vous pouvez l'activer virtualenvavec un autre utilisateur, mais cela ne vous permettra pas d'installer de packages et vous donnera un accès autorisé.
Andrius

Réponses:

106

virtualenvles problèmes d'autorisation peuvent se produire lorsque vous créez le virtualenvcomme sudoet puis faire fonctionner sans sudola virtualenv.

Comme découvert dans le commentaire de votre question, la solution ici est de créer le virtualenvsans sudopour pouvoir y travailler (surtout écrire) sans sudo.

sebastian_oe
la source
4
si je veux le créer dans / opt qui nécessite sudo, je pense que virtualenv ne sera pas installé sans sudo.
Umair A.
7
@sebastian_oe Je pense que je t'aime
Nobbynob Littlun
5
Comment créer le virtualenvsans sudo?
Tunn
Si vous avez créé le virtualenv avec sudo, voir la réponse de @vingtoft pour savoir comment le réparer facilement sans recréer
David A
103

Solution:

Si vous avez créé virtualenv en tant que root, exécutez la commande suivante:

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

Cela résoudra probablement votre problème.

À votre santé

Vingtoft
la source
1
Cela a fonctionné pour moi (chown /usr/local/lib/python3.4), sauf que je ne pense pas avoir créé un virtualenv en tant que root, j'avais en fait installé Python3.4 en tant que root. Je suis toujours en train de tester, mais pensez-vous que je rencontrerai d'autres problèmes avec cette solution, ou est-ce que ce chown corrigera la plupart des erreurs?
ntk4
3
Comment savoir si vous avez créé virtualenv ou python en tant que root?
A__
6

Dans mon cas, j'utilisais mkvirtualenv, mais je ne lui ai pas dit que j'allais utiliser python3. J'ai eu cette erreur:

mkvirtualenv hug
pip3 install hug -U

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

Cela a fonctionné après avoir spécifié python3:

mkvirtualenv --python=/usr/bin/python3 hug
pip3 install hug -U
nealmcb
la source
5

Je n'ai pas créé mon virtualenv en utilisant sudo. La réponse de Sebastian ne s'appliquait donc pas à moi. Mon projet s'appelle utils. J'ai vérifié le utilsrépertoire et j'ai vu ceci:

-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

Comme vous pouvez le voir, utils.egg-infoest la propriété de rootne pas macuser. C'est pourquoi cela me donnait une permission deniederreur. J'ai également dû supprimer /Users/macuser/.virtualenvs/armoury/lib/python2.7/site-packages/utils.egg-linkcar il a été créé par root. Je l'ai fait à pip install -e .nouveau après les avoir supprimés, et cela a fonctionné.

AliBZ
la source
3

Si vous avez créé un environnement virtuel en utilisant root, utilisez cette commande

sudo su

il vous donnera l'accès root, puis activera votre environnement virtuel en utilisant ce

source /root/.env/ENV_NAME/bin/activate
Dinesh Chandra Kumawat
la source
1

Vous n'avez pas activé l'environnement virtuel avant d'utiliser pip.

Essayez-le avec:

$(your venv path) . bin/activate

Et puis utilisez pip -r requirements.txt sur votre dossier principal

jmrueda
la source
1

Cela s'est aussi produit (par accident) après avoir créé un nouveau venv dans un environnement virtuel existant. un moyen simple de diagnostiquer cela serait de voir où le pythonest lié symboliquement, c'est-à-dire exécuter:

ls -l venv/bin/python

et assurez-vous qu'il pointe vers le binaire Python approprié. Pour la plupart des systèmes, ce sera /usr/bin/pythonou /usr/bin/python3. tandis que s'il pointe vers un environnement virtuel existant, ce sera quelque chose comme /home/youruser/somedir/bin/python. si c'est le dernier, je suggérerais de recréer le venv tout en vous assurant que vous n'êtes pas "à l'intérieur" d'un virtualenv existant (c'est-à-dire exécuter deactivate)

Sam Mason
la source
posté ici parce que c'est une question populaire qui mentionne les mots-clés appropriés, elle est donc plus susceptible d'être trouvée et d'être utile à d'autres personnes
Sam Mason
0

Lors de la création de virtualenv, si vous utilisez sudo, le répertoire est créé avec les privilèges root.Ainsi, lorsque vous essayez d'installer un package avec un utilisateur non sudo, vous ne serez pas autorisé à y installer. Alors créez toujours virtualenv sans sudo et installez sans sudo.

Vous pouvez également copier des packages installés sur python global vers virtualenv.

cp -r /lib/python/site-packages/* virtualenv/lib/python/site-packages/
Vkreddy Komatireddy
la source
Ce n'était pas le problème: si vous lisez les commentaires, l'OP avait créé l'environnement virtuel avec sudo en premier lieu.
NickD