Creo que su solución basada en prefix
es perfectamente válida. Sin embargo, si usted quiere tener un gestor de shell_env
contexto como el propuesto en issue#263, puede utilizar la siguiente implementación alternativa en los archivos de 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')
Tenga en cuenta que este gestor de contexto modifica env['shell']
en lugar de env['command_prefixes']
(como prefix
gestor de contexto lo hace), por lo que:
- todavía puede utilizar
prefix
(véase el ejemplo de salida abajo) sin los problemas de interacción mencionados en issue#263.
- tiene que aplicar los cambios a
env['shell']
antes de usar shell_env
. De lo contrario, se sobrescribirán los cambios shell_env
y las variables de entorno no estarán disponibles para sus comandos.
Al ejecutar el archivo fab anterior, se obtiene el siguiente resultado:
$ 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.
¿Pero las variables persistirán después de que el tejido cierre la conexión? De la documentación ('prefix' y' shell_env') entiendo que las variables de entorno se establecerán solo para los comandos envueltos. – glarrain