Pycharm:为运行manage.py任务设置环境variables

我已经将我的SECRET_KEY值移出了我的设置文件,并且在加载我的virtualenv时被设置。 我可以确认从python manage.py shell存在的值。

当我运行Django控制台时, SECRET_KEY丢失,因为它应该。 所以在首选项中,我进入了Console> Django Console并加载SECRET_KEY和相应的值。 我回到Django控制台, SECRET_KEY在那里。

正如所料,我还不能运行一个manage.py任务,因为它还没有findSECRET_KEY 。 所以我进入“运行”>“编辑configuration”,将SECRET_KEY添加到Django服务器和Djangotesting中,并添加到项目服务器中。 重新启动Pycharm,确认密钥。

当我运行一个manage.py任务时,比如runserver ,我仍然得到KeyError: 'SECRET_KEY'.

我在哪里把这个钥匙?

由于Pycharm没有从terminal启动,您的环境将不会加载。 总之任何GUI程序都不会inheritanceSHELLvariables。 看到这个原因(假设一个Mac)。

但是,这个问题有几个基本的解决scheme。 作为@ user3228589发布,你可以在PyCharm中设置它作为一个variables。 这有几个利弊。 我个人不喜欢这种方法,因为它不是一个single source 。 为了解决这个问题,我在我的settings.py文件的顶部使用了一个小函数来查找本地.env文件中的variables。 我把所有“私人”的东西放在那里。 我也可以参考我的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可以获取这个文件。 如果你愿意的话,你可以进一步导出这些variables,但是由于设置文件直接调用.env,所以并不需要。

要在PyCharm中设置您的环境variables,请执行以下操作:

  • 打开“文件”菜单
  • 点击“设置”
  • 点击“控制台”旁边的“+”号
  • 点击Python控制台
  • 点击环境variables旁边的“…”button
  • 点击“+”添加环境variables

同样在这里,由于某种原因PyCharm不能看到导出envvariables。 现在我在PyCharm Run / Debug Configurations – >“Environment variables”中设置SECRET_KEY

您可以通过以下方式设置manage.py任务环境variables:

偏好| 语言与框架| Django的| Manage.py任务

通过运行/debugging/控制台configuration设置环境variables不会影响内置的pycharm的manage.py任务。

另一个选项是为我工作:

  1. 打开一个terminal
  2. 激活项目的virtualenv,这将导致挂钩运行并设置环境variables
  3. 从这个命令行启动PyCharm。

Pycharm将有权访问环境variables。 可能是因为某些事情与PyCharm进程是shell的subprocess有关。

在Pycharm中, manage.py任务在独立进程中运行,不能访问你的环境variables(与Run / Debug不一样)。

最简单的解决scheme是通过直接从你的.env文件读取你的python代码来了解环境variables。

看看: https : //github.com/joke2k/django-environ

 import environ env = environ.Env.read_env() # reading .env file SECRET_KEY = env('SECRET_KEY') 

这样,您就拥有了一个单一的configuration来源,并且在IDE中拥有更less的设置。

希望有所帮助,

要解释@ antero-ortiz的答案,不要使用默认的Mac双击或Spotlightsearch来启动PyCharm,您可以直接从terminal启动它。 这将从您的terminal会话inheritance所有的环境variables到PyCharm应用程序。

以下是我如何解决这个问题。

  1. 从您的terminal程序,运行下面的代码片段。
  2. 按照编辑您的运行/debuggingconfiguration的说明validation所做的工作,
    1. 点击Environment variables旁边的...
    2. 然后点击popup的屏幕右下方的显示。 这将显示由debugging进程inheritance的所有环境variables。
    3. 在这个列表中find你的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$') 

边注

在一个文件中包含环境variables,这个文件就是source ,d是Django开发的一个常见模式,对这个最佳实践的讨论最好不要回答。

基于@ 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'] 

@(nu everest)的答案不适合我。 无论你在这个问题中描述的是什么为我工作。 您可以在“运行/debuggingconfiguration”对话框中设置所有环境variables。 这是关于PyCharm 2016.1和也根据https://www.jetbrains.com/help/pycharm/2016.1/run-debug-configuration-python.html?origin=old_help

我正在尝试此设置。 我在我的项目根目录中有一个env.local文件。 我的manage.py如下所示:

 #!/usr/bin/env python import os import sys if __name__ == "__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) 

然后,我只是在PyCharm运行对话框中传递--load-env ,所有的环境variables将在运行时加载。

请注意,“nu everest”提到的答案有效,但除非您在pycharm中创build项目,否则您将不会看到“控制台”选项卡可用。 由于单个文件可以在没有在pycharm中创build项目的情况下运行,有些人可能会感到困惑。 尽pipe您还需要注意,closurespycharm时,运行configuration不属于某个项目,但设置丢失。