web-dev-qa-db-ja.com

virtualenvで環境変数を設定する

環境変数を使用して構成を取得するHerokuプロジェクトがありますが、先にvirtualenvを使用してアプリをローカルでテストします。

Virtualenv内のリモートマシンで定義された環境変数を設定する方法はありますか?

145
Mahmoud Hossam

更新

2017年5月17日現在、autoenvのREADMEは、 direnv がおそらくより良いオプションであり、autoenvが維持されなくなったことを示しています。

古い答え

これを正確に行うためにautoenvを作成しました。

https://github.com/kennethreitz/autoenv

98
Kenneth Reitz

virtualenvwrapper を使用している場合(そうすることを強くお勧めします)、$VIRTUAL_ENV/bin/の同じ名前のスクリプトを使用して、異なるフック(preactivate、postactivate、predeactivate、postdeactivate)を定義できます。 postactivateフックが必要です。

$ workon myvenv

$ cat $VIRTUAL_ENV/bin/postactivate
#!/bin/bash
# This hook is run after this virtualenv is activated.
export Django_DEBUG=True
export S3_KEY=mykey
export S3_SECRET=mysecret

$ echo $Django_DEBUG
True

この設定をプロジェクトディレクトリに保持する場合は、プロジェクトディレクトリから$VIRTUAL_ENV/bin/postactivateへのシンボリックリンクを作成するだけです。

$ rm $VIRTUAL_ENV/bin/postactivate
$ ln -s .env/postactivate $VIRTUAL_ENV/bin/postactivate

シンボリックリンクの作成を自動化するmkvirtualenvを使用するたびにできます。

非アクティブ化時のクリーンアップ

これはそれ自体をクリーンアップしないことに注意してください。 virtualenvを非アクティブ化すると、環境変数は持続します。対称的にクリーンアップするには、$VIRTUAL_ENV/bin/predeactivateに追加できます。

$ cat $VIRTUAL_ENV/bin/predeactivate
#!/bin/bash
# This hook is run before this virtualenv is deactivated.
unset Django_DEBUG

$ deactivate

$ echo $Django_DEBUG

環境で既に設定されている可能性のある環境変数にこれを使用する場合、設定を解除すると、virtualenvを終了するときに完全に設定が解除されることに注意してください。したがって、それが可能性が高い場合は、一時的な場所に以前の値を記録し、非アクティブ化時にそれを読み戻すことができます。

セットアップ:

$ cat $VIRTUAL_ENV/bin/postactivate
#!/bin/bash
# This hook is run after this virtualenv is activated.
if [[ -n $SOME_VAR ]]
then
    export SOME_VAR_BACKUP=$SOME_VAR
fi
export SOME_VAR=Apple

$ cat $VIRTUAL_ENV/bin/predeactivate
#!/bin/bash
# This hook is run before this virtualenv is deactivated.
if [[ -n $SOME_VAR_BACKUP ]]
then
    export SOME_VAR=$SOME_VAR_BACKUP
    unset SOME_VAR_BACKUP
else
    unset SOME_VAR
fi

テスト:

$ echo $SOME_VAR
banana

$ workon myenv

$ echo $SOME_VAR
Apple

$ deactivate

$ echo $SOME_VAR
banana
283
Danilo Bargen

あなたが試すことができます:

export ENVVAR=value

virtualenv_root/bin/activateにあります。基本的に、アクティブ化スクリプトは、virtualenvの使用を開始するときに実行されるため、そこにすべてのカスタマイズを配置できます。

39
kgr

Virtualenvのみ( virtualenvwrapper なし)を使用すると、virtualenvをアクティブにするためにソースとなるactivateスクリプトを使用して環境変数を簡単に設定できます。

実行:

nano YOUR_ENV/bin/activate

次のように、環境変数をファイルの最後に追加します。

export KEY=VALUE

必要に応じて、上記のすばらしい回答でDanilo Bargenが提案したように、同様のフックを設定して環境変数を設定解除することもできます。

34
Nagasaki45

ここには素敵な答えがたくさんありますが、非アクティブ化時に環境変数の設定を解除し、virtualenvを超える追加のライブラリを必要としないソリューションが投稿されたのを見ませんでした。/activate、例として変数MY_SERVER_NAMEおよびMY_DATABASE_URLを使用します。

アクティブ化スクリプトに非アクティブ化の定義があり、その最後で変数の設定を解除する必要があります。

deactivate () {
    ...

    # Unset My Server's variables
    unset MY_SERVER_NAME
    unset MY_DATABASE_URL
}

次に、アクティブ化スクリプトの最後に、変数を設定します。

# Set My Server's variables
export MY_SERVER_NAME="<domain for My Server>"
export MY_DATABASE_URL="<url for database>"

このように、それを機能させるために他のものをインストールする必要はありません。また、virtualenvをdeactivateしたときに変数が残ってしまうことはありません。

26
TheLetterN

Virtualenv内でローカルにこれをテストするために使用できる2つの方法があります。 1つは、Herokuツールベルト(https://toolbelt.heroku.com/)を介してインストールされるツールです。ツールは職長です。 .envファイルに保存されているすべての環境変数をローカルにエクスポートし、Procfile内でアプリプロセスを実行します。

より軽いアプローチを探している場合の2番目の方法は、.envファイルをローカルに持ってから実行することです:

export $(cat .env)
17
CraigKerstiens

インストール autoenv

$ pip install autoenv

(または)

$ brew install autoenv

そして、virtualenvプロジェクトフォルダに.envファイルを作成します

$ echo "source bin/activate" > .env

今、すべてが正常に動作します。

7
Fizer Khan

Django用に設計されていますが、ほとんどの設定で動作する別の方法は、Django-dotenvを使用することです。

4
Ted

すでにHerokuを使用している場合は、 Foreman を介してサーバーを実行することを検討してください。 .envファイルをサポートしています。このファイルは、実行前にアプリにエクスポートされるKEY=VALを含む行のリストです。

3
Michael Mior

別のアプローチは、内部で実行されているvenvでbashシェルをフォークすることです。以下を含む実行可能ファイルを実行します。

# my_env.sh
export MY_VENV=true
bash

〜/ .bashrc put:

# .bashrc
if [ "$MY_VENV" = "true" ]; then
    source ~/.pyenv/bin/activate
    export PYTHONPATH=/some/local/libs
    cd /project/path
    PS1='(my_venv:\w)$ '
fi

分岐したシェルを終了すると、元の環境が復元され、非アクティブ化を実行する必要はありません。

0
Zach Thompson