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任务。
另一个选项是为我工作:
- 打开一个terminal
- 激活项目的virtualenv,这将导致挂钩运行并设置环境variables
- 从这个命令行启动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应用程序。
以下是我如何解决这个问题。
- 从您的terminal程序,运行下面的代码片段。
- 按照编辑您的运行/debuggingconfiguration的说明validation所做的工作,
- 点击
Environment variables
旁边的...
- 然后点击popup的屏幕右下方的显示。 这将显示由debugging进程inheritance的所有环境variables。
- 在这个列表中find你的
SECRET_KEY
。 如果它不在那里,发表评论这个答案,我们可以尝试弄明白!
- 点击
- 您可能需要每次启动时都以这种方式启动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不属于某个项目,但设置丢失。