4

可能重复:
以部署用户身份通过​​结构激活 virtualenv

有人建议我尝试使用fabric 将Django 部署到生产服务器,并使用python 而不是bash 来自动化任务。

我想轻松启动并自动激活我的 virtualenv,并在其中启动 Django 开发服务器。

我创建了一个名为 fabfile.py 的文件:

from fabric.api import local

def activate_env():
    local("source /.../expofit_env/bin/activate")

def run_local_server():
    local("/.../server/manage.py runserver")

def start():
    activate_env()
    run_local_server()

但是,当我跑步时

fab start

我收到以下消息:

[localhost] local: source /.../expofit_env/bin/activate
/bin/sh: 1: source: not found

Fatal error: local() encountered an error (return code 127) while executin
'source /.../expofit_env/bin/activate'

我究竟做错了什么?


更新

根据 Burhan Khalid 的建议,我尝试了以下方法:

....
def activate_env():
    local("/bin/bash /.../expofit_env/bin/activate")
....

只跑

fab activate_env

结果:

[localhost] local: /bin/bash /.../expofit_env/bin/activate

Done.

但是执行后,virtualenv 没有被激活。对于以下代码:

def start_env(): 
    with prefix('/bin/bash /.../expofit_env/bin/activate'): 
        local("yolk -l")

我仍然得到一个错误,好像 virtualenv 没有被激活。

alan@linux ~/Desktop/expofit $ fab start_env
[localhost] local: yolk -l
/bin/sh: 1: yolk: not found

当我手动激活 virtualenv 时,蛋黄工作正常:

alan@linux ~/.../expofit_env $ source bin/activate
(expofit_env)alan@linux ~/.../expofit_env $ yolk -l

DateUtils       - 0.5.2        - active 
Django          - 1.4.1        - active 
Python          - 2.7.3rc2     - active development (/usr/lib/python2.7/lib-dynload)
....

更新

从这个问题尝试了一种新方法。

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

env.activate = 'source /.../expofit_env/bin/activate'

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

def deploy():
    with virtualenv():
        local('yolk -l')

给出同样的错误:

[localhost] local: yolk -l
/bin/sh: 1: source: not found

Fatal error: local() encountered an error (return code 127) while executing 'yolk -l'

Aborting.

即使面团第一个命令也没有错误地通过:

alan@linux ~/.../expofit_env/bin $ fab virtualenv

[servername] Executing task 'virtualenv'

Done.

更新

可以local使用自定义 shell 运行。

from fabric.api import local

def start_env():
        local('source env/bin/activate',shell='/bin/bash')

但是,这并没有像手动完成一样激活 virtualenv。

4

2 回答 2

3

要从 fab 文件中启用 virtualenv,您需要运行以下命令:

def task():

    # do some things outside the env if needed 

    with prefix('source bin/activate'):
        # do some stuff inside the env
        pip install django-audiofield

with bloc 中的所有命令都将在 virtualenv 中执行

于 2012-10-04T00:13:31.887 回答
2

默认情况下,您使用的是shshell,并且source命令是 bashism(即,仅在 bash 中有效的东西)。

要激活您的环境,您需要直接使用 bash 执行它。/bin/bash /path/to/bin/activate.

于 2012-10-03T11:20:17.203 回答