4

重複の可能性:
デプロイユーザーとしてファブリックを介してvirtualenvをアクティブ化する

Djangoを本番サーバーにデプロイし、bashの代わりにpythonを使用してタスクを自動化するために、ファブリックを使用することをお勧めします。

簡単に起動して、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を手動でアクティブ化すると、yolkは正常に機能しました。

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カスタムシェルでを実行することが可能です。

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

デフォルトでは、shシェルを使用しており、sourceコマンドは bashism (つまり、bash でのみ機能するもの) です。

環境をアクティブにするには、bash で直接実行する必要があります。/bin/bash /path/to/bin/activate.

于 2012-10-03T11:20:17.203 に答える