web-dev-qa-db-fra.com

Comment utiliser un python virtualenv avec sudo?

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 accessible à plusieurs. utilisateurs. Je peux très bien créer et activer virtualenv, mais lorsque je Sudo une commande (par exemple pour créer ou compiler un autre logiciel), c’est le système python qui est utilisé (je peux le dire en raison des modules disponibles). ).

Comme sur Ubuntu ce n’est pas une bonne chose d’utiliser l’utilisateur root, existe-t-il un moyen de dire à Sudo d’utiliser virtualenv? Ou peut-être que ce n'est pas la bonne approche et que je devrais faire une installation complètement nouvelle de python?

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

45
Marco P.

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 transférés.

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

55
Ken Kinder

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"

4
steveayre

Je suis tombé par hasard sur cette situation et pour les autres qui pourraient être confrontés au 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

4
corey_s