下面将会讲解Fabric关于颜色输出和上下文管理方面的api讲解。

Fabric核心API:
Color output functions

颜色打印:
#打印颜色输出,绿色输出
from fabric.colors import green
print(green("This text is green!"))

#红色和绿色输出
from fabric.colors import red, green
print(red("This sentence is red, except for " + green("these words, which are green") + "."))

#其他的一些颜色api
#其中第二个参数bold用于显示输出的信息是加粗显示
fabric.colors.blue(text, bold=False)
fabric.colors.cyan(text, bold=False)
fabric.colors.green(text, bold=False)
fabric.colors.magenta(text, bold=False)
fabric.colors.red(text, bold=False)
fabric.colors.white(text, bold=False)
fabric.colors.yellow(text, bold=False)



Context managers for use with the with statement.

#使用with声明进行上下文管理
which doesn’t work due to how shell-less SSH connections are implemented – state is not kept between invocations of run or sudo:

fabric.context_managers.cd(path)
用于切换在远程主机的目录,如果要和其他命令组合使用的话需要使用with声明,默认cd切换远程目录是对其他命令不影响的。
例如,我想切换到/var/www目录下显示目录下的内容:
cd("/var/www")
run("ls")
上面的这段代码的结果是不正确的
正确的做法是需要结合with声明
with cd("/var/www"):
    run("ls")
如果想在本地目录切换的话就使用lcd


fabric.context_managers.char_buffered(pipe)
强制本地终端的管道类型是character而不是line和buffered,仅用于是unix终端下,在windows下无需设置

fabric.context_managers.hide(*groups)
隐藏指定的输出:
groups中包括:
    Status  状态信息,通常用户使用键盘终端,或者是server断开了连接,这些status信息很重要
    aborts  中止信息,类似状态信息,仅仅到fabric当作是library的时候需要关闭,即使这个被关闭了,aborts仍然发生
    warnings 警告信息,
    running 运行过程中的一些输出,比如命令正在运行过程中或者file传输过程中的一些输出
    stdout 标准输出 本地或者远程与命令相关的标准输出
    stderr 标准错误输出 本地或者远程与命令相关的错误输出
    user 用于生产的一些信息(比如本地打印的一些信息)

例子:
def test_hide():
    with hide('stdout','stderr'):
        run("ls -al")
上面的例子将不会有任何输出,因为标准输出和标准输入都隐藏了


fabric.context_managers.lcd(path)
实现对本地目录的切换
例子:
def test_lcd():
    with lcd("/var/www"):
        local("scp ./* 172.16.35.2:~/")
上面的列子将会把/var/www中的文件拷贝到172.16.35.2的家目录中


fabric.context_managers.path(path, behavior='append')
设置PATH环境变量,用于直接执行shell命令,不需要使用绝对路径。
有三种behavior:
    append 对PATH变量进行追加(追加到其后)
    prepend 对PATH变量进行追加(追加到其前)
    replace 对PATH变量之间进行替换
例子:
def test_path():
    with path("/usr/local/nginx/sbin/",behavior='append'):
        run("nginx")

上面的例子将会启动远程主机的nginx,在此之前你要先定义好env.hosts和env.password,还要就是别忘了导入path


fabric.context_managers.prefix(command)
    对任何包裹在sudo和run里面的命令加上&&
    with prefix('cd /tmp'):
            run('./manage.py syncdb')
上面的代码等同于cd /tmp && ./manage.py syncdb

prefix的嵌套使用:
    with prefix('cd /var/www'):
        run('ls')
        with prefix('cd html'):
            run('ls')
上面的代码等同于:
        cd /var/www && ls
        cd /var/www && cd html && ls


fabric.context_managers.quiet()
是settings(hide('everything'), warn_only=True)的别名,用于隐藏一些输出,并且warn_only用于设置当发生错误的时候不是直接
Aborting直接终止程序而是出现warning警告并正常退出.


fabric.context_managers.remote_tunnel(*args, **kwds)
用于建立一个通道,转发本地的一个可见端口到远程
例子:
def test_remote():
    with remote_tunnel(80):
        run("curl http://127.0.0.1")
上面的例子代表:在远程执行curl http://127.0.0.1访问远程主机的本地80端口,而这个80端口是映射到本地主机的80端口
所以最终的结果就是在远程主机上访问本地主机的80端口


fabric.context_managers.settings(*args, **kwargs)
用于设置一些fabric内置变量,这个之前使用了,这里就不举列子了

fabric.context_managers.shell_env(**kw)
用于设置shell环境变量,相当于使用export命令导出环境变量
例子
def test_shell():
    with shell_env(TEST="test"):
        run("echo $TEST")

上面的例子将会在远程主机设置一个TEST的变量,然后输出


fabric.context_managers.show(*args, **kwds)
和hide相反,用于开启一些输出的

fabric.context_managers.warn_only()
前面已经谈论到这个变量的作用,这里就不再说了