69 votes

Comment utiliser un virtualenv Python avec sudo ?

J'essaie de créer un environnement Python distinct de celui du système (en utilisant virtualenv) dans un répertoire qui n'est pas sous /home, parce que je dois l'utiliser pour construire d'autres logiciels qui doivent être accessibles à plusieurs utilisateurs. Je peux créer et activer le virtualenv sans problème, mais lorsque je sudo une certaine commande (par exemple pour faire ou compiler un autre logiciel), c'est le système Python qui est utilisé (je peux le dire grâce aux modules disponibles).

Puisque sur Ubuntu il n'est pas bon d'utiliser l'option racine il existe un moyen de dire à l'utilisateur sudo 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).

83voto

Ken Kinder Points 3900

Le problème est 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 lancer l'opération suivante sudo ./AwesomeProject/bin/python <script> pour utiliser le script avec le virtualenv avec les privilèges de root.

7voto

wvxvw Points 269

En fonction de votre cas d'utilisation particulier, cela peut ou non résoudre votre problème, mais cela n'a pas encore été mentionné ici. Disons que vous voulez exécuter un script Python qui a été installé dans votre environnement virtuel, et vous devez setuid(0) c'est-à-dire que vous voulez l'exécuter en tant que super-utilisateur. Disons que votre script s'appelle myscript.py alors, vous pouvez le faire comme ça :

(.venv) $ sudo -E env PATH=$PATH ./myscript.py

Explication

(.venv) $ est l'invite du Shell, vous n'avez pas besoin de le taper, il montre simplement que vous utilisez actuellement un environnement virtuel, et que vous n'êtes pas un utilisateur privilégié.

sudo -E dira sudo que lorsqu'il démarre un processus, il doit copier les variables d'environnement de votre environnement actuel Shell. Donc, si vous avez des variables supplémentaires définies dans la section .venv/bin/activate script, ils devraient rester dans le coin pendant que vous êtes root .

env PATH=$PATH lors de l'utilisation de sudo -E toutes les variables d'environnement ne sont pas préservées, en particulier, et c'est le plus important, les variables de type PATH peuvent être supprimés. Les spécificités de ce comportement dépendront de votre fichier sudoers. Cependant, cela contournera tout ce qui est écrit dans le fichier sudoers, car cela copiera le fichier PATH explicitement dans l'environnement sudo crée pour le nouveau processus. Ceci est important parce que lorsque votre système résout le commentaire shebang dans votre myscript.py il cherchera dans le PATH et le premier répertoire qui correspond aux exigences de l'interpréteur sera utilisé. venv d'autre part, configure l'environnement Shell de telle sorte que le répertoire contenant le lien symbolique vers l'interpréteur Python choisi apparaisse en premier, amenant ainsi le système à localiser le Python désiré avant tout autre Python sur le chemin du système.

4voto

corey_s Points 81

Je viens de tomber sur ce problème et pour les autres qui pourraient rencontrer 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 a été d'ajouter les lignes suivantes à mon script. Cela a l'avantage supplémentaire de toujours charger l'environnement virtuel directement à partir du script. (Ce qui signifie que vous pouvez utiliser le script avec crontab ou launchd sans autre contournement).

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 : https://virtualenv.pypa.io/en/latest/userguide.html#using-virtualenv-without-bin-Python

4voto

steveayre Points 141

Parfois, vous devez mettre à jour le $PATH parce que 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"

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X