Comment utiliser un serveur virtuel python avec sudo?

47

J'essaie de créer un environnement python distinct de celui du système (à l'aide de virtualenv) dans un répertoire ne se trouvant pas sous / home, car je dois l'utiliser pour créer un autre logiciel devant être accessible à plusieurs utilisateurs. Je peux très bien créer et activer virtualenv, mais lorsque je sudocommande (par exemple, de créer ou de compiler un autre logiciel), c'est le python système qui est utilisé (je peux dire en raison des modules disponibles).

Étant donné que sur Ubuntu, l’utilisation de l’ utilisateur root n’est pas une bonne chose , existe-t-il un moyen de décider sudod’utiliser virtualenv? Ou peut-être que ce n'est pas la bonne approche et que je devrais faire une toute nouvelle installation de python?

J'utilise la version 64 bits d'Ubuntu 12.04 (et python 2.7).

Marco P.
la source
1
Est-ce que ça marche? sudo $ (quel python) <script>
John Drinane

Réponses:

58

Le problème est presque certainement que lorsque vous exécutez sudo, les variables d'environnement, les alias, les fonctions, etc. de virtualenv ne sont pas reportés.

La solution serait d'exécuter explicitement le fichier exécutable Python de l'environnement virtuel avec sudo. Par exemple, si votre virtualenv est ./AwesomeProject, vous pouvez sudo ./AwesomeProject/bin/python <script>utiliser le script avec virtualenv avec les privilèges root.

Ken Kinder
la source
3
Vous pouvez également laisser la première ligne de votre script pointer sur le binaire Python de votre virtualenv. #!<virtualenv_dir>/bin/python.
OrangeTux
Ugh, ennuyeux que ce n'est que la solution jusqu'à présent. Sur Mac, sudo python utilise python à partir de l’env virtuel.
Gaefan
4

Je suis tombé par hasard sur cette situation et pour les autres qui pourraient trouver le même problème, Ken a raison de dire que les variables env ne sont pas reportées. La solution que j'ai utilisée consistait à ajouter les lignes suivantes à mon script. Cela présente l'avantage supplémentaire de toujours charger l'environnement virtuel directement à partir du script. (Cela signifie que vous pouvez utiliser le script avec crontab ou launchd sans autre solution.)

base_dir = os.path.dirname(os.path.abspath(__file__))
activate_this = os.path.join(base_dir, 'venv/bin/activate_this.py')
execfile(activate_this, dict(__file__=activate_this))

Plus de fond ici: https://virtualenv.pypa.io/en/latest/userguide.html#using-virtualenv-without-bin-python

corey_s
la source
4

Parfois, vous avez besoin de mettre à jour $ PATH car le script exécute d'autres programmes. Par exemple, pypi-install a besoin de py2dsc-deb dans le PATH. Cette commande fonctionne:sudo sh -c ". venv/bin/activate ; pypi-install $PACKAGE"

steveayre
la source