web-dev-qa-db-ja.com

Pycharm:manage.pyタスクを実行するための環境変数を設定する

SECRET_KEY値を設定ファイルから移動しました。virtualenvをロードすると設定されます。 python manage.py Shellから値が存在することを確認できます。

Django Consoleを実行すると、SECRET_KEYが欠落しているはずです。設定で、[Console]> [Django Console]に移動し、SECRET_KEYと適切な値をロードします。Django Consoleに戻り、SECRET_KEYがあります。

予想どおり、SECRET_KEYが見つからないため、manage.pyタスクをまだ実行できません。それで、[実行]> [構成の編集]に進み、SECRET_KEYをDjangoサーバーとDjangoテストに追加します。Pycharmを再起動して確認します。キー。

runserverなどのmanage.pyタスクを実行しても、KeyError: 'SECRET_KEY'.を取得します

このキーはどこに置きますか?

35
Cole

Pycharmはターミナルから起動しないため、環境はロードされません。つまり、GUIプログラムはシェル変数を継承しません。理由については this を参照してください(Macを想定)。

ただし、この問題にはいくつかの基本的な解決策があります。 @ user3228589 が投稿されると、これをPyCharm内の変数として設定できます。これにはいくつかの長所と短所があります。私は個人的にこのアプローチが好きではありません。なぜなら、それはsingle source。これを修正するには、settings.pyファイルの先頭にある小さな関数を使用して、ローカル.envファイル。 「プライベート」なものをすべてそこに入れます。また、virtualenvでこれを参照できます。

これがどのように見えるかです。

-settings.py

def get_env_variable(var_name, default=False):
    """
    Get the environment variable or return exception
    :param var_name: Environment Variable to lookup
    """
    try:
        return os.environ[var_name]
    except KeyError:
        import StringIO
        import ConfigParser
        env_file = os.environ.get('PROJECT_ENV_FILE', SITE_ROOT + "/.env")
        try:
            config = StringIO.StringIO()
            config.write("[DATA]\n")
            config.write(open(env_file).read())
            config.seek(0, os.SEEK_SET)
            cp = ConfigParser.ConfigParser()
            cp.readfp(config)
            value = dict(cp.items('DATA'))[var_name.lower()]
            if value.startswith('"') and value.endswith('"'):
                value = value[1:-1]
            Elif value.startswith("'") and value.endswith("'"):
                value = value[1:-1]
            os.environ.setdefault(var_name, value)
            return value
        except (KeyError, IOError):
            if default is not False:
                return default
            from Django.core.exceptions import ImproperlyConfigured
            error_msg = "Either set the env variable '{var}' or place it in your " \
                        "{env_file} file as '{var} = VALUE'"
            raise ImproperlyConfigured(error_msg.format(var=var_name, env_file=env_file))

# Make this unique, and don't share it with anybody.
SECRET_KEY = get_env_variable('SECRET_KEY')

Envファイルは次のようになります。

#!/bin/sh
#
# This should normally be placed in the ${SITE_ROOT}/.env
#
# DEPLOYMENT DO NOT MODIFY THESE..
SECRET_KEY='XXXSECRETKEY'

そして最後に、virtualenv/bin/postactivateがこのファイルを取得できます。さらに進んで、必要に応じて here のように変数をエクスポートすることもできますが、設定ファイルは.envを直接呼び出すため、実際には必要ありません。

41
rh0dium

PyCharmで環境変数を設定するには、次の手順を実行します。

  • 「ファイル」メニューを開きます
  • 「設定」をクリックします
  • 「コンソール」の横にある「+」記号をクリックします
  • Python Console
  • 環境変数の横にある「...」ボタンをクリックします
  • 「+」をクリックして環境変数を追加します
27
nu everest

ここでも同じで、何らかの理由でPyCharmはエクスポートされたenv変数を見ることができません。今のところ、PyCharmの実行/デバッグ構成でSECRET_KEYを設定します->「環境変数」

14
ammonium

私のために働いた別のオプション:

  1. ターミナルを開く
  2. プロジェクトのvirtualenvをアクティブにします。これにより、フックが実行され、環境変数が設定されます。
  3. このコマンドラインからPyCharmを起動します。

Pycharmは環境変数にアクセスできます。シェルの子であるPyCharmプロセスに関係している可能性があります。

13
Antero Ortiz

Manage.pyタスクの環境変数は次の方法で設定できます。

設定|言語とフレームワーク|ジャンゴ| Manage.pyタスク

Run/debug/console構成を介してenv変数を設定しても、組み込みのpycharmのmanage.pyタスクには影響しません。

12
OmriToptix

Pycharmでmanage.pyタスクは、環境変数にアクセスできない孤立したプロセスで実行されます(実行/デバッグとは異なります)。

最も簡単な解決策は、pythonコードを環境変数に対応させるために、.envファイルを直接。

ご覧ください: https://github.com/joke2k/Django-environ

import environ

env = environ.Env.read_env() # reading .env file

SECRET_KEY = env('SECRET_KEY')

そうすれば、構成のソースが1つだけになり、IDEの設定が少なくなります。

お役に立てば幸いです

7
cvng

@ antero-ortiz's answerを言い換えると、デフォルトのMacダブルクリックまたはスポットライト検索を使用してPyCharmを起動する代わりに、ターミナルから直接起動できます。これにより、すべての環境変数がターミナルセッションからPyCharmアプリに継承されます。

この問題を解決する方法は次のとおりです。

  1. ターミナルプログラムから、以下のスニペットを実行します。
  2. 実行/デバッグ構成の編集 およびの指示に従って動作したことを検証します。
    1. ... の隣に Environment variables
    2. 次に、ポップアップ画面の右下にあるShowをクリックします。これにより、デバッグプロセスによって継承された環境変数のすべてallが表示されます。
    3. SECRET_KEYこのリスト。そこにない場合は、この回答にコメントを投稿してください。それを理解することができます。
  3. PyCharmを起動するたびに、この方法で起動する必要があります。

スニペット:

# This file would presumably export SECRET_KEY
source /path/to/env/file
# This is just a shortcut to finding out where you installed PyCharm
# If you used brew cask, it's probably in /opt/homebrew-cask/Caskroom/pycharm
open $(locate PyCharm.app | egrep 'PyCharm.app$')

サイドノート

source 'dになっているファイルに環境変数を含めるのは、Django=開発の一般的なパターンです。

2
Ben

私はこのクラスを作った@ rh0dium驚くべき答えに基づいて:

これが私のsettings.pyです:

import os


class EnvironmentSettings():
    """Access to environment variables via system os or .env file for development

    """
    def __init__(self, root_folder_path):
        self._root_folder_path = root_folder_path

    def __getitem__(self, key):
        return self._get_env_variable(key)

    def __setitem__(self, key, value):
        raise InvalidOperationException('Environment Settings are read-only')

    def __delitem__(self, key):
        raise InvalidOperationException('Environment Settings are read-only')

    def _get_env_variable(self, var_name, default=False):
        """
        Get the environment variable or return exception
        :param var_name: Environment Variable to lookup
        """
        try:
            return os.environ[var_name]
        except KeyError:
            from io import StringIO
            from configparser import ConfigParser

            env_file = os.environ.get('PROJECT_ENV_FILE', self._root_folder_path + "/.env")
            try:
                config = StringIO()
                config.write("[DATA]\n")
                config.write(open(env_file).read())
                config.seek(0, os.SEEK_SET)
                cp = ConfigParser()
                cp.readfp(config)
                value = dict(cp.items('DATA'))[var_name.lower()]
                if value.startswith('"') and value.endswith('"'):
                    value = value[1:-1]
                Elif value.startswith("'") and value.endswith("'"):
                    value = value[1:-1]
                os.environ.setdefault(var_name, value)
                return value
            except (KeyError, IOError):
                if default is not False:
                    return default
                error_msg = "Either set the env variable '{var}' or place it in your " \
                            "{env_file} file as '{var} = VALUE'"
                raise ConfigurationError(error_msg.format(var=var_name, env_file=env_file))


class ConfigurationError(Exception):
    pass


class InvalidOperationException(Exception):
    pass

そして、私のrunserver.pyの中には、この呼び出しコードがあります:

from settings import EnvironmentSettings

root_folder_path = os.path.dirname(os.path.abspath(__file__))
env_settings = EnvironmentSettings(root_folder_path)
config_name = env_settings['APP_SETTINGS']
1
danfromisrael

PyCharm 2018では、設定でDjango manage.py環境変数オプションを使用できます

  • ファイル
  • 設定
  • 言語とフレームワーク
  • Django
  • 環境変数

画像で見ることができます

1

現在、このセットアップを試しています。を持っています env.localファイルは私のプロジェクトルートにあります。僕の manage.pyは次のようになります。

#!/usr/bin/env python
import os
import sys


if __== "__main__":
    os.environ.setdefault("Django_SETTINGS_MODULE", "config.settings.local")

    # Load environment variables from env.local, if option --load-env specified.
    # Good for injecting environment into PyCharm run configurations for example and no need to
    # manually load the env values for manage.py commands
    if "--load-env" in sys.argv:
        with open("env.local") as envfile:
            for line in envfile:
                if line.strip():
                    setting = line.strip().split("=", maxsplit=1)
                    os.environ.setdefault(setting[0], setting[1])
        sys.argv.remove("--load-env")

    from Django.core.management import execute_from_command_line

    execute_from_command_line(sys.argv)

次に、--load-env PyCharm実行ダイアログとすべての環境変数が実行時にロードされます。

0
jaywink

「nu everest」で言及されている答えは機能しますが、pycharmでプロジェクトを作成しない限り、[コンソール]タブは表示されません。 pycharmでプロジェクトを作成せずに個々のファイルを実行できるため、混乱する人がいるかもしれません。ただし、pycharmを閉じると、プロジェクトに属さない実行構成では設定が失われることに注意する必要があります。

0
Part

@(nu everest)による答えは私にはうまくいきませんでした。あなたが質問で説明したものは何でも私のために働いた。 「実行/デバッグ構成」ダイアログですべての環境変数を設定できます。これはw.r.t PyCharm 2016.1であり、また https://www.jetbrains.com/help/pycharm/2016.1/run-debug-configuration-python.html?origin=old_help

0
Nitin

これが役立つ場合の私のmanage.pyファイルです。プロジェクトのルートディレクトリにある.envファイルからすべての変数を読み取ります。

enter image description here

0
saran3h

.envファイルから環境変数を読み取ることができる Django-environ を使用するのが良い方法だと思います。

使用法

まず、Django-environをインストールします

pip install Django-environ

次に、.envファイルと同じディレクトリにsettings.pyファイルを作成します。

$ cd project-settings-directory/
$ touch .env

3番目に、使用する環境変数を.envに追加します。

# .env file
DEBUG=on
SECRET_KEY=your-secret-key
DATABASE_URL=psql://urser:[email protected]:8458/database
SQLITE_URL=sqlite:///my-local-sqlite.db

4番目に、設定ファイルで、importステートメントの直後に以下を追加します。

# other import statements

import environ


# the followin line expects .env file to exist. Otherwise, an IOError exception will be raised.
env = environ.Env.read_env()

5番目に、環境変数をロードします。

DEBUG = env('DEBUG')
SECRET_KEY = env('SECRET_KEY')

それでおしまい。さらに詳しい情報が必要な場合は、ドキュメント を確認してください

注:この構成は、PyCharmからサーバーを実行するときに環境変数を設定するのにも役立ちます。

0
lmiguelvargasf