1. ホーム
  2. python

[解決済み] ファブリック経由でデプロイユーザとしてvirtualenvを有効化する

2022-07-09 14:49:02

質問

私はローカルで私のファブリックスクリプトを実行したいのですが、それは順番に私のサーバーにログインし、ユーザーをデプロイに切り替え、プロジェクトの .virtualenv を有効にして、プロジェクトのディレクトリを変更し、git pull を発行することになります。

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

私は通常、virtualenvwrapperからworkonコマンドを使用し、activateファイルをソースとして、postactivateファイルによりプロジェクトフォルダに入れます。この場合、fabricはshell内から実行されるため、制御はfabricに委ねられるようで、bashの組み込みソースである'$source ~/.virtualenv/myvenv/bin/activate' は使用できません。

どなたか、これをどのように行ったかの例と説明をお持ちの方はいらっしゃいませんか?

どのように解決するのですか?

今現在、あなたは私がしていることをすることができます。これは不器用ですが、完全にうまくいきます*。(この使い方は、あなたがvirtualenvwrapperを使っていることを仮定しています--そうでなければ、あなたが言ったかなり長い「ソース」呼び出しで容易に代用できます)。

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 が適切にエスケープされておらず、特殊なシェル文字を含んでいる場合などです。