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をアクティブ化することはできませんでした。