Je pense que votre prefix
-est parfaitement valable. Toutefois, si vous souhaitez avoir une shell_env
gestionnaire de contexte comme celui proposé dans problème#263 vous pouvez utiliser l'implémentation alternative suivante dans vos fichiers fab :
from fabric.api import run, env, prefix
from contextlib import contextmanager
@contextmanager
def shell_env(**env_vars):
orig_shell = env['shell']
env_vars_str = ' '.join('{0}={1}'.format(key, value)
for key, value in env_vars.items())
env['shell']='{0} {1}'.format(env_vars_str, orig_shell)
yield
env['shell']= orig_shell
def my_task():
with prefix('echo FOO1=$FOO1, FOO2=$FOO2, FOO3=$FOO3'):
with shell_env(FOO1='BAR1', FOO2='BAR2', FOO3='BAR3'):
run('env | grep BAR')
Notez que ce gestionnaire de contexte modifie env['shell']
au lieu de env['command_prefixes']
(comme prefix
gestionnaire de contexte le fait), donc vous :
- peut toujours utiliser
prefix
(voir exemple de sortie ci-dessous) sans les problèmes d'interaction mentionnés dans problème#263 .
- doivent appliquer les changements à
env['shell']
avant d'utiliser shell_env
. Autrement, shell_env
les changements seront écrasés et les variables d'environnement ne seront pas disponibles pour vos commandes.
En exécutant le fichier fab ci-dessus, vous obtenez la sortie suivante :
$ fab -H localhost my_task
[localhost] Executing task 'my_task'
[localhost] run: env | grep BAR
[localhost] out: FOO1=BAR1, FOO2=BAR2, FOO3=BAR3
[localhost] out: FOO1=BAR1
[localhost] out: FOO2=BAR2
[localhost] out: FOO3=BAR3
[localhost] out:
Done.
Disconnecting from localhost... done.