我想将一些值从布料传递到远程环境中,我没有看到很好的方法来实现它。我到目前为止所提出的最好的是:
with prefix('export FOO=BAR'):
run('env | grep BAR')
这似乎有效,但似乎有点像黑客。
我查看了GIT存储库,看起来这是issue #263。
答案 0 :(得分:57)
从面料1.5(已发布)开始,fabric.context_managers.shell_env
可以满足您的需求。
with shell_env(FOO1='BAR1', FOO2='BAR2', FOO3='BAR3'):
local("echo FOO1 is $FOO1")
答案 1 :(得分:11)
我认为您基于prefix
的解决方案完全有效。但是,如果您希望在issue#263中建议使用shell_env
上下文管理器,则可以在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
(请参阅下面的示例输出),而不会出现issue#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.
答案 2 :(得分:2)
Fabric 1.5.0(当前在Git中)将shell作为local()命名参数。 如果你传递'/ bin / bash',它会将它传递给Popen的可执行参数。
它不会执行你的.bashrc,因为.bashrc来源于bash的交互式调用。您可以在本地获取所需的任何文件:
local('. /usr/local/bin/virtualenvwrapper.sh && workon focus_tests && bunch local output', shell='/bin/bash')
答案 3 :(得分:0)
另一种方法是通过命令行传递一个值--set:
--set=domain=stackoverflow.com
然后,您可以使用env.domain
在脚本中找到它请参阅http://docs.fabfile.org/en/1.11/usage/fab.html#cmdoption--set
答案 4 :(得分:0)
尝试使用装饰器
if str(d) == "+":
int(c) == "a + b"