使用Fabric来获得一个带有上下文管理器的shell,比如'prefix'和'cd'?

时间:2013-08-22 16:45:04

标签: python fabric

如何获得一个知道Fabric已应用的任何上下文管理器的交互式shell?

例如,我希望这会在/tmp/打开一个带有virtualenv活动的shell:

with cd("/tmp/"):
    with prefix("source virtualenv/bin/activate"):
        open_shell()

但这不是 - 它只是打开一个普通的登录shell。

使用run("bash")获得了一半,但没有设置PS1,并且所有行都以Fabric [user@host] out: …为前缀。

PS:是的,我知道我可以使用open_shell(command="cd /tmp/; source …"),但我想要一个通用的解决方案。

2 个答案:

答案 0 :(得分:0)

Fabric open_shell函数不支持此功能。

如果您需要,可能需要编写自己的包装器open_shell首先检查env.cwdenv.command_prefixes,然后生成command,然后再生成open_shell传递给{{1}}。

答案 1 :(得分:0)

这是我的实用工具:

def smart_shell(command=''):
    env_commands = "cd '%s'; %s" % (env.cwd, " && ".join(env.command_prefixes))
    open_shell('%s; %s' % (env_commands, command))

# Usage
with cd('/tmp/'), prefix("source virtualenv/bin/activate"):
    smart_shell('./manage.py shell')