Penso che la soluzione basata su prefix
sia perfettamente valida. Tuttavia, se si vuole avere un manager shell_env
contesto come quello proposto in issue#263, è possibile utilizzare il seguente implementazione alternativa nei file 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')
Si noti che questo manager contesto modifica env['shell']
invece di env['command_prefixes']
(come prefix
contesto direttore fa), in modo da:
- è ancora possibile utilizzare
prefix
(vedi esempio sotto uscita) senza i problemi di interazione di cui issue#263.
- è necessario applicare qualsiasi modifica a
env['shell']
prima di utilizzare shell_env
. Altrimenti, le modifiche shell_env
verranno sovrascritte e le variabili di ambiente non saranno disponibili per i comandi.
Quando si esegue il file fab sopra, si ottiene il seguente output:
$ 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.
Ma le variabili permangono dopo che il tessuto ha chiuso la connessione? Dalla documentazione ('prefix' e' shell_env') capisco che le variabili di ambiente saranno impostate solo per i comandi avvolti. – glarrain