échec de l'installation de pip avec: OSError: [Errno 13] Autorisation refusée sur le répertoire

123

pip install -r requirements.txtéchoue avec l'exception ci-dessous OSError: [Errno 13] Permission denied: '/usr/local/lib/.... Quel est le problème et comment résoudre ce problème? (J'essaye de configurer 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'
RunLoop
la source
Connexes (spécifiques à macOS / homebrew) stackoverflow.com/questions/33004708/…
wim

Réponses:

76

Option a) Créez un virtualenv, activez-le et installez:

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

Option b) Installez dans votre domicile:

pip install --user -r requirements.txt

Ma recommandation utilise l'option safe (a), de sorte que les exigences de ce projet n'interfèrent pas avec les exigences d'autres projets.

Hectorcanto
la source
2
J'ai eu une erreur comme celle-ci sudo:pip: command not foundsur mon instance aws ec2 lors de l'exécution de cette commande. Veuillez aider.
user3768495
2
@ user3768495 Probablement, pip n'est pas installé par défaut. Quelle est votre distribution EC2? De plus, python2 peut ne pas être installé, donc vous installez python2 ou utilisez pip3. Soyez prudent avec ceci cependant.
hectorcanto
33
J'ai lu que ce n'est pas recommandé à plusieurs endroits maintenant. On dirait que nous devrions mettre en garde contre l'utilisation de sudo lors de l'exécution de pip (voir la réponse de Bert)
Justus Eapen
3
@ JustusEapen: Je ne sais pas ce que je ressens à ce sujet. Je ne pense pas que la bonne réponse à la question d'OP soit un manuel sur l'hygiène informatique de base, y compris "ne pas exécuter de code loufoque avec les autorisations de superutilisateur" et "se brosser les dents régulièrement". Je trouve que la réponse optimale devrait souligner que les packages peuvent être installés sur une base par utilisateur ou à l'échelle du système, et que l'installation à l'échelle du système, comme OP le souhaitait (il y a des raisons parfaitement cromulentes de le faire) nécessite l'autorisation du super utilisateur. La mise en garde contre l'installation de paquets sur le chemin système est probablement le travail d'un autre sur une autre question SO.
Tobia Tesan
8
vote négatif à cause de sudoconseils. même si cela fonctionne maintenant, cela va vous donner beaucoup de maux de tête à l'avenir.
Gerald
318

Nous devrions vraiment arrêter de conseiller l'utilisation de sudoavec pip install. Il vaut mieux commencer par essayer pip install --user. Si cela échoue, jetez un œil au premier article ici .

La raison pour laquelle vous ne devriez pas utiliser sudoest la suivante:

Lorsque vous exécutez pip avec sudo, vous exécutez du code Python arbitraire à partir d'Internet en tant qu'utilisateur root, ce qui représente un risque de sécurité assez important. Si quelqu'un met en place un projet malveillant sur PyPI et que vous l'installez, vous donnez à un attaquant un accès root à votre machine.

Bert
la source
5
Bonne observation. Cela, après tout, vaut pour tous sudo x install, pour tous x(y compris x = make).
Tobia Tesan le
1
Cela a également résolu mon problème. Que fait l'ajout de --user?
Miles Johnson
1
@MilesJohnson Adding --userinstalle le package dans votre répertoire personnel, plutôt qu'à la racine. L'installation de quelque chose à cet emplacement ne nécessite aucun privilège supplémentaire.
bert
1
De plus, si vous êtes sur un serveur distant derrière un proxy, "sudo" vous empêche de récupérer les packages depuis les référentiels Internet et / ou les référentiels git du réseau du serveur distant.
Ataxias
2
Toute mention de a sudoété supprimée il y a un an. Cette réponse est obsolète - veuillez la réviser et la mettre à jour. Vous devez également mentionner les installations et les autorisations par utilisateur par rapport à l'ensemble du système. N'utilisez pas votre réponse pour critiquer directement d'autres réponses, qui auront tendance à devenir rapidement obsolètes.
smci
28

Vous essayez d'installer un package sur le chemin d'accès à l'échelle du système sans avoir l'autorisation de le faire.

  1. En général, vous pouvez utiliser sudopour obtenir temporairement les autorisations de superutilisateur sous votre responsabilité afin d'installer le package sur le chemin d'accès à l'échelle du système:

     sudo pip install -r requirements.txt

    En savoir plus sudo ici .

    En fait, c'est une mauvaise idée et il n'y a pas de bon cas d'utilisation, voir le commentaire de @ wim.

  2. Si vous ne souhaitez pas apporter de modifications à l'échelle du système, vous pouvez installer le package sur votre chemin par utilisateur à l'aide de l' --userindicateur.

    Tout ce qu'il faut, c'est:

     pip install --user runloop requirements.txt
  3. Enfin, pour un contrôle encore plus fin , vous pouvez également utiliser un virtualenv , qui pourrait être la solution supérieure pour un environnement de développement, surtout si vous travaillez sur plusieurs projets et que vous souhaitez garder une trace des dépendances de chacun.

    Après avoir activé votre virtualenv avec

    $ my-virtualenv/bin/activate

    la commande suivante installera le package dans le virtualenv (et non sur le chemin à l'échelle du système):

    pip install -r requirements.txt

Tobia Tesan
la source
4
L'exécution de pip avec root comporte des risques de sécurité
Nrzonline
L'exécution de tout ce qui exécute du code à partir d'Internet en tant que root comporte des risques de sécurité.
Tobia Tesan
C'est presque la meilleure réponse, mais elle doit encore être mise à jour. a) Maintenant, nous pyenv/pipenvdevons mentionner ceux-ci, de préférence à virtualenv(ou conda-env) b) sudo considérés comme nuisibles, et voir les autres réponses pourquoi. Mettez donc la réponse basée sur l'environnement en premier, et la réponse sudo en dernier, avec un gros avertissement.
smci
1
sudo pip install -r requirements.txtn'a jamais raison. L'environnement python du système appartient au système, point final . Si vous installez plus de choses python dans le système, faites - le avec gestionnaire de paquets uniquement (par exemple sudo yum install, apt-get, etc ...) étant donné que ces prises en pension devraient avoir des versions sûres et compatibles des bibliothèques Disp.
wim
1
@TobiaTesan L'ancien sudo make installcode, généralement compilé + lié, n'est pas vraiment analogue à un sudo pip installcar l' installation de Python env sur le système peut invalider les dépendances . Supposons qu'il y ait un service système python-frobnicator, qui a une dépendance sur froblib(ce sera également dans le gestionnaire de packages et épinglé à une version compatible), puis vous sudo pip installune autre application ou bibliothèque qui a une dépendance sur " froblib > 1.2". Pip se fera un plaisir de "mettre à jour" la version du système froblibavec une version plus récente, qui peut être incompatible / non testée et casser le système.
wim
26

Simplement clarifiant ce qui a fonctionné pour moi après beaucoup de douleur sous Linux (basé sur ubuntu) sur des erreurs de permission refusées, et en tirant parti de la réponse de Bert ci-dessus, j'utilise maintenant ...

$ pip install --user <package-name>

ou si vous exécutez pip sur un fichier d'exigences ...

$ pip install --user -r requirements.txt

et ceux-ci fonctionnent de manière fiable pour chaque installation de pip, y compris la création d'environnements virtuels.

Cependant, la solution la plus propre de ma nouvelle expérience a été d'installer python-virtualenvet virtualenvwrapperavec sudo apt-get installau niveau du système.

Ensuite, dans les environnements virtuels, utilisez pip installsans le --userdrapeau ET sans sudo. Beaucoup plus propre, plus sûr et plus facile dans l'ensemble.

Thom Ives
la source
J'obtiens un "Impossible d'effectuer une installation '--user'. Les packages de site utilisateur ne sont pas visibles dans cette virtualenv." erreur lors de la tentative d'utilisationpip install --user -r requirements.txt
Amir A. Shabani
@ AmirA.Shabani la réponse a été modifiée depuis votre question. Il dit maintenant «dans les environnements virtuels, utilisez pip install sans le drapeau --user ET sans sudo»
Daishi
7

L'utilisateur n'a pas l'autorisation d'écriture pour certains chemins d'installation Python. Vous pouvez donner l'autorisation en:

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

Donc, vous devez donner la permission, puis essayez de l'installer à nouveau, si vous avez de nouveaux chemins, vous devez également donner la permission:

sudo chown -R $USER /usr/local/lib/python2.7/
PISTOLETS Mesut
la source
2
Pour python installé avec brew, c'est la bonne réponse car brew maintient les packages en tant qu'utilisateur local (pas de racine).
idbrii
9
chown le répertoire / usr / local n'est pas une bonne idée. Il n'appartient pas à l'utilisateur. Vous devriez lire la structure des fichiers unix.
user8162
6
Stuff under /usrappartiendrait généralement à root, ces jours-ci. Chown récursivement là pourrait bousiller votre système. ÉVITEZ .
wim
0

Si vous avez besoin d'autorisations, vous ne pouvez pas utiliser «pip» avec «sudo». Vous pouvez faire une astuce pour pouvoir utiliser «sudo» et installer le package. Placez simplement «sudo python -m ...» devant votre commande pip.

sudo python -m pip install --user -r package_name
j35t3r
la source
Cela me semble bien, mais pourriez-vous s'il vous plaît ajouter quelques explications.
pythonic833
-1

Donc, j'ai eu cette même erreur exacte pour une raison complètement différente. En raison d'un bug Homebrew + pip totalement distinct mais connu , j'avais suivi cette solution de contournement répertoriée dans la documentation d'aide de Google Cloud, où vous créez un fichier .pydistutils.cfg dans votre répertoire personnel. Ce fichier a une configuration spéciale que vous êtes censé utiliser uniquement pour l'installation de certaines bibliothèques. J'aurais dû supprimer ce fichier disutils.cfg après avoir installé les packages, mais j'ai oublié de le faire. Donc, la solution pour moi était en fait juste ...

rm ~/.pydistutils.cfg.

Et puis tout a fonctionné normalement. Bien sûr, si vous avez une configuration dans ce fichier pour une raison réelle, vous ne voudrez pas simplement rm directement ce fichier. Mais au cas où quelqu'un d'autre ferait cette solution de contournement et oublierait de supprimer ce fichier, cela a fait l'affaire pour moi!

bwest87
la source
-1

C'est un problème de permission,

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

ce serait par défaut /usr/local/lib/python2.7/

ou essayez,

pip install --user -r package_name

et puis dites, pip install -r requirements.txt cela va s'installer dans votre env

ne dites pas, sudo pip install -r requirements.txtcela va s'installer dans un chemin python arbitraire.

Mohideen bin Mohammed
la source