Мисля, че вашето базирано на prefix
решение е напълно валидно. Ако обаче искате да имате shell_env
контекстен мениджър като този, предложен в issue#263, можете да използвате следната алтернативна реализация във вашите 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')
Имайте предвид, че този контекстен мениджър променя env['shell']
вместо env['command_prefixes']
(както прави prefix
контекстният мениджър), така че вие:
- все още може да използва
prefix
(вижте примерен резултат по-долу) без проблемите с взаимодействието, споменати в проблем №263.
- трябва да приложите всички промени към
env['shell']
, преди да използвате shell_env
. В противен случай shell_env
промените ще бъдат презаписани и променливите на средата няма да са налични за вашите команди.
Когато изпълнявате fab файла по-горе, получавате следния изход:
$ 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.
person
jcollado
schedule
10.12.2011
prefix
иshell_env
) разбирам, че променливите на средата ще бъдат зададени само за опакованите команди. - person glarrain   schedule 17.07.2013