2015-04-13 3 views
3

donc je googler un événement où pip requis privilèges de Sudo, et je suis tombé sur les deux fils suivants What are the risks of running 'sudo pip'? et Is it acceptable & safe to run pip install under sudo?installations de python global et local, et en cours d'exécution accidentellement un fichier des exigences en dehors de virtualenv

Le premier thread parle du risque de sécurité d'exécuter un fichier .py inconnu avec pip (a du sens), mais à partir du second j'ai presque eu l'impression qu'il existe une installation python globale et locale que vous ne devriez pas mélanger. Je suppose qu'il est logique que vous puissiez avoir une installation globale pour tous les utilisateurs et peut-être un chemin d'accès aux paquets locaux pour chaque utilisateur, mais est-ce vrai? (cela aurait aussi du sens puisque ubuntu (que j'utilise) a des dépendances sur certains paquets python, donc avoir un répertoire python protégé par une racine globale les protégerait). Cependant, si cela est vrai, je ne trouve pas les deux répertoires séparés. J'ai essayé

import sys 
print(sys.path) 

avec sudo et sans sudo, et j'ai obtenu exactement les mêmes répertoires.

En tout cas, je pense que je vais passer à pip virtualenv, mais dans ce cas je me demandais, que se passerait-il si j'oubliais accidentellement d'activer l'environnement et couru un exotic requirements.txt dehors? Cela ne va-t-il pas corrompre mon répertoire utilisateur standard que j'essaye de garder propre (si c'est le cas, est-ce que c'est revertible?) Je pense juste, il oublie de taper un commando, et puis votre installation python est foirée

+0

C'est assez simple: N'oubliez pas de vous activer virtualenv. Oui, si vous utilisez Exotic requirements.txt, cela pourrait polluer votre installation python. L'une des premières étapes avant de démarrer un projet est de créer un dossier séparé et d'y avoir un virtualenv avec votre version python requise. – letsc

+0

* Je ne fais que penser, c'est seulement oublier de taper une commande, et puis votre installation python est foiré. * Pas vraiment. Comme vous le savez probablement maintenant, vous ne devriez pas utiliser ** sudo ** avec pip pour éviter de casser votre * installation Python * à l'échelle du système. Si vous n'utilisez pas * sudo * avec pip, peu importe ce que vous installez, vous ne gâcherez pas votre système. En outre, vous pouvez lire [this] (http://stackoverflow.com/posts/22517157/revisions) les informations que j'ai ajoutées à ma réponse récemment. –

Répondre

4

Je conseille en effet de toujours utiliser virtualenv pour les besoins spécifiques d'une certaine application. Les outils que vous utilisez en tant que développeur pour plusieurs projets (quelque chose comme ipdb) sont bien à installer globalement sur le système. Notez que tous les paquets pip sont open source, donc vous avez l'assurance que les paquets de pip célèbres ne contiennent probablement pas de code malveillant, mais pourraient contenir des fuites de sécurité bien sûr.

Pour éviter l'installation accidentelle d'un paquet de pépin en dehors d'un virtualenv, vous pouvez ajouter à votre .bashrc:

export PIP_REQUIRE_VIRTUALENV=true 

Lorsque vous exécutez alors pip install something en dehors d'un virtualenv, il affichera un message d'erreur:

Could not find an activated virtualenv (required). 

Si vous voulez toujours pouvoir installer des paquets pip en dehors d'un virtualenv, vous pouvez ajouter une fonction dans votre .bashrc comme ceci:

syspip() { 
    PIP_REQUIRE_VIRTUALENV="" sudo pip "[email protected]" 
} 

Ensuite, vous pouvez exécuter syspip install something pour installer quelque chose globalement sur votre système.

En ce qui concerne le script que vous utilisez:

import sys 
print(sys.path) 

Peu importe si vous exécutez cela avec sudo ou non, sudo ne change que les privilèges utilisateur que vous exécutez la commande avec, pour ce script, il n'a pas d'importance.

+0

* Peu importe que vous exécutiez cela avec sudo ou non, sudo ne change que les droits d'utilisateur avec lesquels vous exécutez la commande, ce n'est pas grave pour ce script. * Pas vrai. Sudo change souvent d'environnement, y compris 'PATH', ce qui est important ici. Voir [Est-ce que sudo une commande change temporairement $ PATH pour être celle de la racine?] (Http://unix.stackexchange.com/q/151310/5355) –

+0

@PiotrDobrogost Ce n'est pas la même chose que la variable d'environnement bash '$ PATH' , voir la documentation: https://docs.python.org/3.7/library/sys.html#sys.path – rednaw

+0

Je suis bien conscient de ce qu'est 'sys.path'. Cependant, comme cela dépend de ce que Python exécute, cela dépend aussi de '$ PATH' (si vous ne spécifiez pas le chemin exact de l'interpréteur). –

1

Exécution sudo pip install <package> va installer le package à l'ensemble du système de paquets, généralement stocké quelque part comme /usr/lib/python2.7/site-packages. L'exécution de pip install package sans virtualenv activé tentera d'installer le paquet au même endroit, mais parce que (si votre système est correctement configuré/correctement) vous n'aurez pas accès en écriture à ce dossier, la commande d'installation échouera.

Il est généralement préférable d'utiliser des paquets de distribution si vous le pouvez pour des installations globales si vous devez absolument les installer globalement, car vous bénéficiez alors de mises à jour automatiques. Comme vous l'avez compris, il est préférable de ne pas installer de paquetages du tout, et d'utiliser virtualenvs.