環境変数を使用して構成を取得するHerokuプロジェクトがありますが、先にvirtualenvを使用してアプリをローカルでテストします。
Virtualenv内のリモートマシンで定義された環境変数を設定する方法はありますか?
2017年5月17日現在、autoenvのREADMEは、 direnv がおそらくより良いオプションであり、autoenvが維持されなくなったことを示しています。
これを正確に行うためにautoenvを作成しました。
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
あなたが試すことができます:
export ENVVAR=value
virtualenv_root/bin/activateにあります。基本的に、アクティブ化スクリプトは、virtualenvの使用を開始するときに実行されるため、そこにすべてのカスタマイズを配置できます。
Virtualenvのみ( virtualenvwrapper なし)を使用すると、virtualenvをアクティブにするためにソースとなるactivate
スクリプトを使用して環境変数を簡単に設定できます。
実行:
nano YOUR_ENV/bin/activate
次のように、環境変数をファイルの最後に追加します。
export KEY=VALUE
必要に応じて、上記のすばらしい回答でDanilo Bargenが提案したように、同様のフックを設定して環境変数を設定解除することもできます。
ここには素敵な答えがたくさんありますが、非アクティブ化時に環境変数の設定を解除し、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
したときに変数が残ってしまうことはありません。
Virtualenv内でローカルにこれをテストするために使用できる2つの方法があります。 1つは、Herokuツールベルト(https://toolbelt.heroku.com/)を介してインストールされるツールです。ツールは職長です。 .envファイルに保存されているすべての環境変数をローカルにエクスポートし、Procfile内でアプリプロセスを実行します。
より軽いアプローチを探している場合の2番目の方法は、.envファイルをローカルに持ってから実行することです:
export $(cat .env)
インストール autoenv
$ pip install autoenv
(または)
$ brew install autoenv
そして、virtualenvプロジェクトフォルダに.env
ファイルを作成します
$ echo "source bin/activate" > .env
今、すべてが正常に動作します。
Django用に設計されていますが、ほとんどの設定で動作する別の方法は、Django-dotenvを使用することです。
すでにHerokuを使用している場合は、 Foreman を介してサーバーを実行することを検討してください。 .env
ファイルをサポートしています。このファイルは、実行前にアプリにエクスポートされるKEY=VAL
を含む行のリストです。
別のアプローチは、内部で実行されている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
分岐したシェルを終了すると、元の環境が復元され、非アクティブ化を実行する必要はありません。