2011-11-29 65 views
39

我想将结构中的一些值传递到远程环境中,而我没有看到一个很好的方法来实现它。目前为止最好的我是:在面料中添加环境变量的最佳方法?

with prefix('export FOO=BAR'): 
    run('env | grep BAR') 

这似乎工作,但它似乎有点破解。

我查看了GIT存储库,看起来这是issue #263

+1

但是在结构关闭连接之后,变量是否会持续?从文档('prefix'和'shell_env')我知道环境变量只会被设置为包装命令。 – glarrain

回答

11

我认为您的prefix为基础的解决方案是完全有效的。不过,如果你想有一个shell_env上下文管理作为issue#263提出的一个,你可以使用下面的另一种实现在你的工厂文件:

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(见下面的示例输出),而在issue#263提到的相互作用问题。
  • 必须在使用shell_env之前对env['shell']进行任何更改。否则,shell_env更改将被覆盖,并且环境变量将无法用于您的命令。

当执行上面的晶圆厂文件,你会得到以下输出:

$ 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. 
+1

我一直在使用这种技术,但我注意到在织物的更高版本中它不再起作用。相反,你应该/必须使用可以工作的fabric.context_managers.shell_env实现。 –

2

面料1.5.0(目前在GIT)采用外壳为本地()命名的参数。 如果您传递'/ bin/bash',它将它传递给Popen的可执行参数。

它不会执行你的.bashrc,因为.bashrc来源于bash的交互式调用。可以输出你想要内部本地任意文件:

local('. /usr/local/bin/virtualenvwrapper.sh && workon focus_tests && bunch local output', shell='/bin/bash') 
56

面料1.5(释放),fabric.context_managers.shell_env你想要做什么。

with shell_env(FOO1='BAR1', FOO2='BAR2', FOO3='BAR3'): 
     local("echo FOO1 is $FOO1") 
+1

在Windows上似乎不起作用。已添加支持,但它不在最新版本(1.6)中。 –

+0

但是,在结构关闭连接之后变量会持续吗?从文档我明白,环境变量将被设置为包装命令只。 – glarrain

+0

@glarrain是的,这就是他们实现它作为上下文管理器的一点 – Anentropic