通过结构作为部署用户激活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