通过结构作为部署用户激活virtualenv

我想在本地运行我的结构脚本,然后再登录到我的服务器,切换用户进行部署,激活项目.virtualenv,这将改变目录到项目并发出git pull。

def git_pull():
    sudo('su deploy')
    # here i need to switch to the virtualenv
    run('git pull')

我通常使用来自virtualenvwrapper的workon命令,其中激活文件和postactivate文件将把我放到项目文件夹中。 在这种情况下,由于织物从外壳运行,控制权交给织物,所以我不能使用内置到'$ source〜/ .virtualenv / myvenv / bin / activate'的bash源代码

任何人都有他们如何做到这一点的例子和解释?


现在,你可以做我自己做的事情,但是它非常好用(这种用法假设你使用的是virtualenvwrapper--你应该这样做),但是你可以很容易地用你提到的更长的'source'调用替代, 如果不):

def task():
    workon = 'workon myvenv && '
    run(workon + 'git pull')
    run(workon + 'do other stuff, etc')

从版本1.0开始,Fabric有一个使用这种技术的prefix上下文管理器,所以你可以例如:

def task():
    with prefix('workon myvenv'):
        run('git pull')
        run('do other stuff, etc')

*必然会出现使用command1 && command2方法的情况,例如command1失败时( command2永远不会运行),或者command1没有正确转义并包含特殊的shell字符,等等。


作为bitprophet预测的更新:使用Fabric 1.0,您可以使用prefix()和您自己的上下文管理器。

from __future__ import with_statement
from fabric.api import *
from contextlib import contextmanager as _contextmanager

env.hosts = ['servername']
env.user = 'deploy'
env.keyfile = ['$HOME/.ssh/deploy_rsa']
env.directory = '/path/to/virtualenvs/project'
env.activate = 'source /path/to/virtualenvs/project/bin/activate'

@_contextmanager
def virtualenv():
    with cd(env.directory):
        with prefix(env.activate):
            yield

def deploy():
    with virtualenv():
        run('pip freeze')

我只是使用一个简单的包装函数virtualenv(),可以调用,而不是run()。 它不使用cd上下文管理器,因此可以使用相对路径。

def virtualenv(command):
    """
    Run a command in the virtualenv. This prefixes the command with the source
    command.
    Usage:
        virtualenv('pip install django')
    """
    source = 'source %(project_directory)s/bin/activate && ' % env
    run(source + command)
链接地址: http://www.djcxy.com/p/23821.html

上一篇: Activate a virtualenv via fabric as deploy user

下一篇: pass same method to multiple decorator functions