Python 使用织物&x27;s使用上下文管理器(如';前缀';和';cd&x27;应用

Python 使用织物&x27;s使用上下文管理器(如';前缀';和';cd&x27;应用,python,fabric,Python,Fabric,我怎样才能得到一个交互式shell,它知道任何已应用的Fabric上下文管理器 例如,我希望这会在/tmp/中打开一个shell,其中virtualenv处于活动状态: with cd("/tmp/"): with prefix("source virtualenv/bin/activate"): open_shell() 但事实并非如此——它只是打开了一个普通的登录shell 使用run(“bash”)可以达到一半,但是没有设置PS1,所有行都以Fabric的[use

我怎样才能得到一个交互式shell,它知道任何已应用的Fabric上下文管理器

例如,我希望这会在
/tmp/
中打开一个shell,其中virtualenv处于活动状态:

with cd("/tmp/"):
    with prefix("source virtualenv/bin/activate"):
        open_shell()
但事实并非如此——它只是打开了一个普通的登录shell

使用
run(“bash”)
可以达到一半,但是没有设置
PS1
,所有行都以Fabric的
[user@host]输出:…


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

Fabric的
open_shell
功能不支持此功能


如果您想这样做,您可能需要将自己的包装器写入
open\u shell
,首先检查
env.cwd
env.command\u前缀
,以便生成
命令
,然后将其传递到
open\u shell
以下是我的实用程序:

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')

通过键入它们并按Enter键。如果您的意思是自动,那么您不应该打开shell而只使用
run()