我想将一些值从结构传递到远程环境,我没有看到一个很好的方法来做到这一点.到目前为止我提出的最好的是:
with prefix('export FOO=BAR'): run('env | grep BAR')
这似乎有效,但似乎有点像黑客.
我查看了GIT存储库,看起来这是问题#263.
从面料1.5(发布),fabric.context_managers.shell_env
做你想要的.
with shell_env(FOO1='BAR1', FOO2='BAR2', FOO3='BAR3'): local("echo FOO1 is $FOO1")
我认为你prefix
的解决方案是完全有效的.但是,如果您希望将shell_env
上下文管理器设置为问题#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.