Comment utiliser un serveur virtuel python avec sudo?

40

J'essaie de séparer un environnement python de celui du système (en utilisant virtualenv) dans un répertoire qui ne se trouve 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 sudo une commande (par exemple, pour créer ou compiler un autre logiciel), c’est le python système qui est utilisé (je peux dire en raison des modules disponibles).

Etant donné qu'Ubuntu n'utilise pas 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 toute nouvelle installation de python?

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

    
posée Marco P. 31.12.2012 - 20:13
la source

3 réponses

50

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 serait d'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.

    
réponse donnée Ken Kinder 22.01.2013 - 00:46
la source
3

Je suis juste 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 d'informations ici: lien

    
réponse donnée corey_s 17.06.2015 - 02:43
la source
3

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 chemin PATH. Cette commande fonctionne: sudo sh -c ". venv/bin/activate ; pypi-install $PACKAGE"

    
réponse donnée steveayre 07.03.2017 - 09:36
la source

Lire d'autres questions sur les étiquettes