virtualenvで環境変数を設定する


160

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

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

回答:


106

更新

2017年5月17日の時点で、autoenvのREADMEには、direnvがおそらくより優れたオプションであり、autoenvがもはや維持されていないことが示されています。

古い答え

私はこれを正確に行うためにautoenvを書きました:

https://github.com/kennethreitz/autoenv


12
非常に面白いgif:D
chachan 2014年

3
.envちなみに、少なくとも私の経験では、ファイルがHerokuのビルドに悪影響を及ぼしているようです。そのため、リポジトリに含めないでください。長い間ユーザー/ autoenv btwの大ファン。こんにちは、ケネス、ダマン!
ギャララン、2015年

この回答は編集後も関連がありますか?提案されたソリューションについてのご意見は何であるNagasaki45TheLetterN
凍結

288

virtualenvwrapperを使用している場合(使用することを強くお勧めします)、同じ名前のスクリプトを使用して、異なるフック(preactivate、postactivate、predeactivate、postdeactivate)を定義できます$VIRTUAL_ENV/bin/。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

ただの正確さ:やってln -s .env/postactivate $VIRTUAL_ENV/bin/postactivateはうまくいきませんでした。lnフルパスが必要なので、私はしなければなりませんln -s `pwd`/.env/postactivate $VIRTUAL_ENV/bin/postactivate
でした

@ZoneurどのOSを使用していますか?Linuxでは、相対パスはで機能しlnます。
Danilo Bargen 2013

@DaniloBargen LinuxMint 3.2.0を使用しています。この答えlnはフルパスが好きだと言ったので試してみましたがうまくいきました 私catが相対パスでシンボリックリンクを試みたとき、それは言ったNo such file or directory
Zoneur 2013

@dpwrussel、それはレビューでほとんど達成できませんでした、それは良い追加ですが、それは非常に重要なのでそれは独自の投稿として作成されたかもしれません(それはあなたにいくつかの担当者を獲得させたでしょう)。良い答えがたくさんあります:)
ケントフレドリック'15年

2
そしてソース管理?これは、envを必要とするプロジェクトを複製して設定する他の人々にどのように変換されますか。var.s?
CpILL

44

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

export ENVVAR=value

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


2
それで十分かどうかはわかりませんが、確実に機能します!
chachan 2014年

2
ええ、それは安くて厄介ですが、時にはそれが必要なものです。
Michael Scheper、2014

1
私はこれをお勧めしません、私はそれをしました、そしていつかすべてのアクティブ化スクリプト(activate、activate.csh、activate.fish)が自動的に上書きされたので、私の変更を失いました。postactivateおよびpredeactivateを使用します。
wil93 2018年

=の前後にスペースを入れないでください
Rik Schoonbeek

deactivate関数定義virtualenv_root / bin / activateに'unset ENVVAR'を追加して、設定と設定解除のバランスを取ることもできます
Lou Zell

42

(なしのみvirtualenvのを使用しvirtualenvwrapper)、環境変数を設定することによって簡単ですactivateあなたはvirtualenvのを活性化するために調達したスクリプト。

実行:

nano YOUR_ENV/bin/activate

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

export KEY=VALUE

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


9
はるかに健全なアプローチのIMO。cd単に環境変数を持つようにオーバーライドしていますか?身震い
ミシェルミュラー

非アクティブ後のクリーンアップはどうですか?
buncis

36

ここには多くの良い答えがありますが、両方とも非アクティブ化での環境変数の設定解除を含み、追加のライブラリを必要としないソリューションが投稿されていないvirtualenvので、/ bin / activateを編集して、変数MY_SERVER_NAMEMY_DATABASE_URL例として:

activateスクリプトにはdeactivateの定義が必要であり、その最後に変数を設定解除したいとします。

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>"

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


3
外部のライブラリやアプリは必要ないので、このアプローチが好きですが、この問題は、環境を再構築するとすべての設定が失われることです。
VStoykov 2016

2
このアプローチの利点は、セットアップのスピードと魔法の欠如です。環境変数をソース管理の外に置くと、常に環境を再構築するときに秘密/設定が破壊される可能性があるという問題に戻ります。
Anthony Manning-Franklin

これが機能するために、virtualenvディレクトリがリポジトリにチェックインされることになりますか?変数に、リポジトリで望まない秘密が保持されている場合はどうなりますか?これをどのように扱いますか?
フラクチャー2018年

2
移植性があまり高くないため、virtualenvをリポジトリに含めるのがなぜ良いのかわかりませんが、アクティブ化スクリプトの代わりに別のファイルにエクスポートを配置して、それは存在し、そのファイルをリポジトリに追加しないでください。
TheLetterN 2018年

18

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

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

export $(cat .env)

6

autoenvをインストールする

$ pip install autoenv

(または)

$ brew install autoenv

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

$ echo "source bin/activate" > .env

これですべてが正常に動作します。


3

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


3

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


1

envディレクトリでvirtualenvをアクティブにし、.env使用中に保存された環境変数をエクスポートするには:

source env/bin/activate && set -a; source .env; set +a

別名で保存echo 'alias e=". env/bin/activate && set -a; source .env; set +a"' >> ~/.bash_aliases
Daniil Mashkin
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.