Est-il acceptable et sûr d'exécuter pip install sous sudo?

114

J'ai commencé à utiliser mon Mac pour installer des packages Python de la même manière que je le fais avec mon PC Windows au travail; Cependant, sur mon Mac, j'ai rencontré de fréquentes erreurs d' autorisation refusées lors de l'écriture dans des fichiers journaux ou des packages de site.

Par conséquent, j'ai pensé à courir pip install <package>sous sudomais est-ce une utilisation sûre / acceptable de sudo étant donné que je veux juste que cela soit installé sous mon compte d'utilisateur actuel?

Exemple de traceback à partir d'une erreur d'E / S de fichier journal:

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'

Mise à jour Cela était probablement dû aux autorisations, mais la meilleure approche consiste à utiliser des environnements virtuels pour vos projets python. La course à pied sudo pipdoit être évitée sauf en cas de nécessité absolue.

markwalker_
la source
12
Je trouve que « cd /tmp; sudo pip install foo» est une solution de contournement adéquate.
Brian Cain
@pradyunsg pourquoi signaler une question aussi ancienne?
markwalker_
3
Essentiellement, la réponse actuellement acceptée (et la mise à jour dans la question) suggère d'exécuter "sudo pip" - quelque chose que les responsables de pip (moi-même étant l'un d'entre eux) disent activement aux gens de ne pas faire car cela peut entraîner la rupture de votre système d'exploitation sur MacOS et de nombreuses (toutes?) grandes distributions Linux. J'ai atterri ici en utilisant des termes que quelqu'un qui déboge sa situation pourrait et voulait juste que cela redirige les gens vers un endroit avec de meilleurs conseils. Je n'ai pas pensé à poser cette question et sa réponse est mieux conforme à la déclaration ci-dessus. (hors caractères)
pradyunsg
@markwalker_ seriez-vous prêt à supprimer ce conseil de la question et éventuellement à le remplacer par un meilleur conseil (en utilisant --user ou un virtualenv)?
pradyunsg

Réponses:

105

Utilisez un environnement virtuel :

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

Vous n'utilisez sudoou des autorisations élevées que lorsque vous souhaitez installer des éléments pour l'installation Python globale à l'échelle du système.

Il est préférable d'utiliser un environnement virtuel qui isole les packages pour vous. De cette façon, vous pouvez jouer sans polluer l'installation globale de python.

En prime, virtualenv n'a pas besoin d'autorisations élevées.

Burhan Khalid
la source
2
Si ses autorisations sont gâchées pour son répertoire personnel , l'utilisation de virtualenv ne l'aidera probablement pas
hd1
1
Oui, c'est le cas, mais c'est déjà arrivé, il doit donc le réparer avant de continuer.
hd1
1
Merci les gars, j'ai déjà lu sur virtualenv alors j'espère que ces deux solutions ensemble me permettront de me remettre sur la bonne voie :)
markwalker_
1
aussi, pour installer virtualenv, vous devez sudo ... ou existe-t-il une solution de contournement?
jimijazz
8
Je ne comprends pas pourquoi c'est la meilleure réponse. La question ne concerne PAS les environnements virtuels. Il s'agit de la validité de l'utilisation sudo pip install. Disons que j'ai besoin d'installer un package que j'utiliserai dans de nombreux projets ou au niveau du système. Tels que certains outils CLI comme pgcli. Évidemment, je n'ai pas besoin d'environnement virtuel pour cela, je veux l'installer globalement. Dois-je utiliser sudo pip installou il existe des pratiques plus correctes? Telle est la question.
Alex Belyaev
42

Est-il acceptable et sûr de courir pip installsous sudo?

Ce n'est pas sûr et c'est mal vu - voir Quels sont les risques d'exécuter «sudo pip»? Pour installer le package Python dans votre répertoire personnel, vous n'avez pas besoin de privilèges root. Voir la description de l' --useroption de pip.

Piotr Dobrogost
la source
Bien que votre solution ait été la première à fonctionner, @throws_exceptions_at_you a créé une réponse avec du code réel et non une redirection vers la documentation
Edenshaw
Je ne sudo pip installconnaissais pas les dommages causés par son utilisation. Comment puis-je annuler cette commande ou bloquer l'exécution sous sudo?
Emre Değirmenci le
26

Votre problème initial est que pip ne peut pas écrire les journaux dans le dossier.

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

Vous devez placer un cd dans un dossier dans lequel le processus appelé peut écrire comme /tmpceci cd /tmpet ré-invoquer la commande fonctionnera probablement, mais ce n'est pas ce que vous voulez.

MAIS en fait pour ce cas particulier (vous ne voulez pas utiliser sudopour installer des packages python) et pas besoin d'installer des packages globaux, vous pouvez utiliser l' --userindicateur comme ceci:

pip install --user <packagename>

et cela fonctionnera très bien.

Je suppose que vous avez une installation python python pour un utilisateur et que vous ne voulez pas vous soucier de lire sur virtualenv (qui n'est pas très convivial) ou pipenv .

Comme certaines personnes dans la section des commentaires l'ont souligné, l'approche suivante n'est pas une très bonne idée à moins que vous ne sachiez pas quoi faire et que vous soyez coincé:

Une autre approche pour les packages globaux comme dans votre cas, vous voulez faire quelque chose comme:

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

ou plus généralement

chown -R $USER <path to your global pip packages>
throws_exceptions_at_you
la source
9
-1 Changer la propriété du dossier global site-packages est une chose terrible à faire. L' --useroption pour pip a été donnée comme solution dans ma réponse qui existait déjà lorsque vous avez écrit la vôtre.
Piotr Dobrogost
1
Je ne vois pas d'argument ici. De plus, étant donné que quelqu'un qui pose une telle question d'entrée de gamme n'est probablement pas familier avec le système d'autorisation d'Unix et, par conséquent, exécute une installation pour 1 utilisateur, cela n'a pas d'importance. De plus, votre réponse ne parvient pas à aborder le cas d'utilisation de moi VOULANT réellement installer sur des packages globaux. Après cela, je pourrais facilement rétablir les autorisations en pré-installation.
throws_exceptions_at_you
2
+1 pour écrire les commandes entières . Certaines personnes supposent que l'OP sait comment implémenter une option sur la ligne de commande alors qu'eux-mêmes ou d'autres lecteurs ne le peuvent pas. Vous n'êtes pas d'accord, @PiotrDobrogost?
Laissez-moi y réfléchir
l'ajout --userm'aide!
Honghao Zhang
2
Changer les permissions pour le site-packagesrépertoire entier de Python système revient à "réparer" une pompe en la frappant avec une clé. Il est protégé pour une raison - vous n'êtes pas censé y installer des éléments . La vraie solution n'est pas de mélanger la distribution système Python avec la programmation au jour le jour. Installez une distribution Python différente (depuis Python.org, Homebrew, Canopy, etc.).
charlesreid1
9

Parce que j'ai eu le même problème, je tiens à souligner qu'en fait le premier commentaire de Brian Cain est la solution au problème "IOError: [Errno 13]":

S'il est exécuté dans le répertoire temporaire ( cd /tmp), IOError ne se produit plus si je cours sudo pip install foo.

Edgar
la source
2
Pouvez-vous expliquer pourquoi cela résout le problème pour vous?
Chris
8
vous utilisez toujours sudo pipcette "solution" et installez ainsi des packages avec les privilèges root, ce qui n'est probablement pas ce que vous voulez?
Chris
Je ne peux que deviner pourquoi cela fonctionne: je pense que certaines parties de (certains) scripts d'installation de pip nécessitent un accès en écriture au répertoire actuel, mais avec un utilisateur différent. Par conséquent, s'il est exécuté dans votre répertoire personnel, il échoue mystérieusement en raison du manque d'accès en écriture. S'il est appelé de l'intérieur, /tmpcela fonctionne, car tout le monde y a un accès en écriture.
Edgar
Il n'a pas d'accès en écriture à '/Users/markwalker/Library/Logs/pip.log'
throws_exceptions_at_you
5

J'ai eu un problème d'installation virtualenvwrapperaprès l'installation réussie virtualenv.

Mon terminal s'est plaint après avoir fait ceci:

pip install virtualenvwrapper

Donc, j'ai essayé sans succès ceci (NON RECOMMANDÉ) :

sudo pip install virtualenvwrapper

Ensuite, je l'ai installé avec succès avec ceci:

pip install --user virtualenvwrapper
Laissez-moi y réfléchir
la source
L'option --user pour pip a été donnée comme solution dans ma réponse qui existait déjà lorsque vous avez écrit la vôtre. Cela aurait dû être un commentaire et non une réponse.
Piotr Dobrogost
vous dites NON recommandé mais les notes d'installation officielles indiquent OK pour installer virtualenvwrapper avec sudo. Il en va de même pour virtualenv. La question posée ici ne fait aucune référence à ces deux-là, donc je suppose que toutes les autres réponses ici sont pour les paquets python généraux.
mehmet
Aux futurs lecteurs, j'ai frappé mon drapeau "non recommandé" dans ma réponse en raison du commentaire ci-dessus mais je ne l'ai pas encore vérifié. C'est pourquoi je n'ai pas encore supprimé le drapeau.
Laissez-moi y réfléchir
4

Il semble que vos autorisations soient gâchées. Tapez chown -R markwalker ~le terminal et réessayez pip? Faites-moi savoir si vous êtes trié.

hd1
la source
Bien que cela puisse résoudre le problème des autorisations, cela ne répond pas à la question.
Burhan Khalid
1
Résoudre des problèmes que je ne savais pas avoir est un bonus! chowndonne Operation not permittedbeaucoup de répertoires cachés comme .shsh& je suppose que cela fonctionne avec des fichiers qu'il peut maintenant définir, mais je verrai ce qui se passe lorsque l'invite cli revient.
markwalker_