pycharm run/debug configuration. Примеры конфигураций

12 февраля 2014 г. 3:50

Конфигурации бывают нескольких видов. В моей практике распространены две:

  1. Django server - для запуска самого сайта.
  2. Python - для выполнения различных скриптов, у меня чаще всего management-команд.

Расмотрим в отдельности.

Запуск Django приложения в PyCharm (Пример конфигурации Django server)

У меня лично этот процесс происходит автоматически, то есть при открытии папки проекта (через меню "File \ Open...") PyCharm самостоятельно создаёт конфигурацию Django server с необходимыми настройками:

Если у меня открыть настройки, то он будут такими:

Атоматически распознать Django server и проставить настройки помогает структура папок проекта. У меня она выглядит следующим образом:

collect_static - папка, куда собирается вся статика на боевом сервере для раздачи через прокси-сервер (у меня nginx).
email_auth - приложение, кастомная модель пользователя.
env - виртуальное окружение.
media - сюда собираются все файлы загруженные через сайт.
spec - это простое приложение, которе выполняет некоторые функции сайта. У вас оно может по-другому называться.
static - папка со статическими файлами на уровне проекта.
templates - папка с шаблонами на уровне проекта.

Пример manage.py

from os.path import join, exists, abspath, dirname
import os
import sys
import subprocess
import shutil

PROJECT_ROOT = abspath(dirname(__file__))
REQUIREMENTS = join(PROJECT_ROOT, 'requirements.txt')

VE_ROOT = join(PROJECT_ROOT, 'env')


def go_to_ve():
    # going into ve
    if not sys.prefix == VE_ROOT:
        if sys.platform == 'win32':
            python = join(VE_ROOT, 'Scripts', 'python.exe')
        else:
            python = join(VE_ROOT, 'bin', 'python')

        retcode = subprocess.call([python, __file__] + sys.argv[1:])
        sys.exit(retcode)

delete_ve = 'del_ve' in sys.argv or 'delete_ve' in sys.argv
if delete_ve:
    if exists(VE_ROOT):
        print 'Deleting env...'
        shutil.rmtree(VE_ROOT)
        print 'Done.'
        sys.exit(0)

update_ve = 'up_ve' in sys.argv or 'update_ve' in sys.argv
if update_ve:
    # install ve
    if not exists(VE_ROOT):
        import virtualenv
        print 'Creating virtualenv...'
        virtualenv.logger = virtualenv.Logger(consumers=[])
        virtualenv.create_environment(VE_ROOT, site_packages=False)
        print 'Done.'

    go_to_ve()
    # check requirements
    import pip
    pip.main(['install', '-r', REQUIREMENTS])
    sys.exit(0)

if exists(VE_ROOT):
    go_to_ve()
    # print 'Found virtualenv. Entering...'

try:
    import settings
except ImportError:
    import sys
    sys.stderr.write("Error: Can't find the file 'settings.py' in the directory")
    sys.exit(1)

if __name__ == '__main__':
    if not delete_ve:
        os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'settings')

        from django.core.management import execute_from_command_line
        execute_from_command_line(sys.argv)

Пример settings.py

# -*- coding: utf-8 -*-
from __future__ import unicode_literals
import os
try:
    import local_settings
except ImportError:
    import local_settings_sample as local_settings

DEBUG = local_settings.DEBUG
ROOT_DIR = os.path.dirname(__file__)

ADMINS = (('Maltsev Artem', 'admin@vits.pro'), )

EMAIL_HOST = local_settings.EMAIL_HOST
EMAIL_PORT = local_settings.EMAIL_PORT
EMAIL_HOST_USER = local_settings.EMAIL_HOST_USER
EMAIL_HOST_PASSWORD = local_settings.EMAIL_HOST_PASSWORD
EMAIL_USE_TLS = getattr(local_settings, 'EMAIL_USE_TLS', False)
EMAIL_USE_SSL = getattr(local_settings, 'EMAIL_USE_SSL', False)
SERVER_EMAIL = EMAIL_HOST_USER
DEFAULT_FROM_EMAIL = EMAIL_HOST_USER

MANAGERS = ADMINS

DATABASES = local_settings.DATABASES

TIME_ZONE = 'Asia/Irkutsk'
LANGUAGE_CODE = 'ru'

LANGUAGES = (('ru', 'Russian'), )

SITE_ID = 1

USE_I18N = True
USE_L10N = True
USE_TZ = True

USE_X_FORWARDED_HOST = True

MEDIA_ROOT = os.path.join(ROOT_DIR, 'media')
MEDIA_URL = "/media/"

STATIC_ROOT = os.path.join(ROOT_DIR, 'collect_static')
STATIC_URL = '/static/'

STATICFILES_DIRS = (
    os.path.join(ROOT_DIR, 'static'),
)

STATICFILES_FINDERS = (
    'django.contrib.staticfiles.finders.FileSystemFinder',
    'django.contrib.staticfiles.finders.AppDirectoriesFinder',
    'sass_processor.finders.CssFinder',
    'compressor.finders.CompressorFinder',
)

SECRET_KEY = local_settings.SECRET_KEY

MIDDLEWARE_CLASSES = (
    'django.middleware.cache.UpdateCacheMiddleware',
    'django.contrib.sessions.middleware.SessionMiddleware',
    'django.middleware.csrf.CsrfViewMiddleware',
    'django.contrib.auth.middleware.AuthenticationMiddleware',
    'django.contrib.messages.middleware.MessageMiddleware',
    'django.middleware.locale.LocaleMiddleware',
    'django.middleware.common.CommonMiddleware',
    'django.middleware.gzip.GZipMiddleware',
    'cms.middleware.language.LanguageCookieMiddleware',
    'cms.middleware.user.CurrentUserMiddleware',
    'cms.middleware.page.CurrentPageMiddleware',
    'cms.middleware.utils.ApphookReloadMiddleware',
    'cms.middleware.toolbar.ToolbarMiddleware',
    'django.middleware.cache.FetchFromCacheMiddleware',
)

TEMPLATES = [{
    'BACKEND': 'django.template.backends.django.DjangoTemplates',
    'DIRS': [os.path.join(ROOT_DIR, 'templates'), ],
    'OPTIONS': {
        'context_processors': [
            'django.contrib.auth.context_processors.auth',
                'django.template.context_processors.debug',
                'django.template.context_processors.i18n',
                'django.template.context_processors.media',
                'django.template.context_processors.static',
                'django.template.context_processors.tz',
                'django.template.context_processors.csrf',
                'django.template.context_processors.request',
                'django.contrib.messages.context_processors.messages',

                'sekizai.context_processors.sekizai',
                'cms.context_processors.cms_settings',
        ],
        'loaders': [
            ('django.template.loaders.cached.Loader', [
                'django.template.loaders.filesystem.Loader',
                'django.template.loaders.app_directories.Loader',
                'admin_tools.template_loaders.Loader',
            ]),
        ]}
}, ]

ROOT_URLCONF = 'urls'
WSGI_APPLICATION = 'wsgi.application'

INSTALLED_APPS = (
    'djangocms_admin_style',
    'admin_tools',
    'admin_tools.dashboard',
    'django.contrib.auth',
    'email_auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.sites',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    'django.contrib.admin',
    'django.contrib.sitemaps',

    'djangocms_text_ckeditor',  # note this needs to be above the 'cms' entry

    'cms',
    'treebeard',
    'menus',
    'sekizai',

    'compressor',
    'spec',
    'sass_processor',
) + PROJECT_APPS

SILENCED_SYSTEM_CHECKS = ('auth.E003', 'auth.W004')
AUTH_USER_MODEL = 'email_auth.User'

CACHES = {
    'default': {
        'BACKEND': 'django.core.cache.backends.locmem.LocMemCache',
    },
}

LOGGING = {
    'version': 1,
    'disable_existing_loggers': False,
    'filters': {
        'require_debug_false': {
            '()': 'django.utils.log.RequireDebugFalse'
        }
    },
    'handlers': {
        'mail_admins': {
            'level': 'ERROR',
            'filters': ['require_debug_false'],
            'class': 'django.utils.log.AdminEmailHandler'
        }
    },
    'loggers': {
        'django.request': {
            'handlers': ['mail_admins'],
            'level': 'ERROR',
            'propagate': True
        }
    }
}

ALLOWED_HOSTS = getattr(local_settings, 'ALLOWED_HOSTS', ['localhost', ])

TEST_RUNNER = 'django.test.runner.DiscoverRunner'
if DEBUG:
    INTERNAL_IPS = ('127.0.0.1', )

# --- CMS ---
CMS_TEMPLATES = (
    ('default.html', 'По умолчанию'),
)
# --- end CMS ---

Пример рабочего проекта

Для наглядности я подготовил рабочий демонстрационный проект, который вы можете скачать для наглядности:

Пример проекта без виртуального окружения (1,1 МБ)

Пример проекта с виртуальным окружением (36,4 МБ)

По идее, загрузив пример проекта с виртуальным окружением, и открыв его через меню "File \ Open...", PyCharm автоматически определит Django Server конфигурацию и вы сразу сможете запустить проект. Не забудьте только создать базу данных и применить миграции.

Пример простой конфигурации python-скрипта

Передо мной встала задача: написать скрипт оповещения клиентов об скором истечении срока действия услуг. Запуск скрипта должен производиться из консоли для того, чтобы его можно было добавить в cron. Решением этой задачи служит использование management команды.

Скрипт я написал: теперь самое время его протестировать и отладить в случае необходимости. И чтобы это было легче проводить, можно воспользоваться debug-ом в самом PyCharm-е. Для этого нужно добавить необходимую конфигурацию.

Добавить в PyCharm конфигурацию запуска обычного python скрипта достаточно просто: в списке конфигураций выбираем "Edit Configurations..." (на рисунке выделено синим цветом).

Затем щёлкаем по зелёному плюсику (выделено синей рамкой) и выбираем python:

А затем проделываем несколько нехитрых действий:

  1. Вписываем имя конфигурации в поле "Name". В моём случае client_notifications, и у меня часто имя конфигурации совпадает с именем самого скрипта - так удобно.
  2. Указываем полный путь до скрипта в "Script". Да, на скриншоте путь начинается с E :) Раньше под виндой сидел, теперь давно уже на Linux-е.
  3. Пишем параметры скрипта в "Script parameters". Имя файла моего скрипта client_notifications, поэтому его и пишем.

Нажимаем окей и можно дебажить!

Что касается поля "Interpreter options" - там указываются параметры самого интерпретатора python. По сути они вставляются между python и manage.py.
А "Working directory" можно не трогать. В данном случае он ни на что не влияет.

Запуск Django-Shop приложения в PyCharm

Разберём более сложный пример запуска конфигурации: попробуем запустить скаченный с какого-нибудь репозитория (напр., github) проект на Django. В качестве примера выберем Django Shop - платформа для создания интернет-магазина.

Для начала откроем терминал и склонируем проект с github:

git clone https://github.com/awesto/django-shop.git

Далее выполним специфичные команды для запуска Django Shop демо-примера (для каждого проекта свои команды по запуску!):

cd django-shop
virtualenv ~/.virtualenvs/django-shop
source ~/.virtualenvs/django-shop/bin/activate
pip install -e .
pip install -r requirements/test_py3.txt
pip install Django==1.9.10
npm install  # в версиях 0.9.3 и выше, сначала нужно зайти в папку example
cd example
export DJANGO_SHOP_TUTORIAL=commodity
export DJANGO_DEBUG=True
./manage.py initialize_shop_demo
./manage.py compilescss

В общем случае для любого проекта нужно:

  1. Создать виртуальное окружение командой virtualenv.
  2. Войти в виртуальное окружение командой source.
  3. Установить зависимости (чаще всего они перечислены в файле requirements.txt) командой pip install.
Замечание
Другие выше перечисленные команды я не буду объяснять в данной статье, так как, ещё раз повторюсь, для каждого проекта свои команды по подготовке к запуску приложения.

И наконец, запускаем проект:

./manage.py runserver

Если в терминале получилось запустить проект, то переходим к его запуску в PyCharm. Для этого открываем в PyCharm-е наш проект:

Нам важно, чтобы мы смогли просматривать в PyCharm все файлы проекта, склонированного с github, поэтому выбираем корневую папку проекта django-shop.

Теперь нам нужно добавить поддержку Django для приложения. Для этого выбираем в меню: "File \ Settings ...":

В этом окне нужно настроить Django project root. Эту директорию можно выбирать такую, в которой лежит manage.py. После выбора директории вы заметите, что PyCharm сам попытался определить местонахождение manage.py и settings.py. Давайте ему поможем, определив точное месторасположение этих файлов. В случае с Django Shop settings.py лежит в папке myshop, поэтому щёлкаем на значок "Три точки" в соответствующем поле для открытия диалогового окна и находим наш settings.py.

Обратите внимание, что мы также добавили переменную окружения DJANGO_SHOP_TUTORIAL в поле Environment variables. Чуть ниже вы увидите, что переменные окружения также добавляются при создании конфигурации, и для Django Shop переменную DJANGO_SHOP_TUTORIAL нужно задавать в двух местах, потому что этот проект требует обязательного наличия DJANGO_SHOP_TUTORIAL в переменных окружения. А так как запуск management команд через PyCharm (гор. клавиша Ctrl + Alt + R) таких, как makemigrations или migrate, происходит в отдельной конфигурации, поэтому без указания DJANGO_SHOP_TUTORIAL команды не смогут запуститься и выведут такую ошибку django.core.exceptions.ImproperlyConfigured: Environment variable DJANGO_SHOP_TUTORIAL is not set:

Поэтому поставим DJANGO_SHOP_TUTORIAL=commodity.

Теперь проверим правильно ли выбрано виртуальное окружение для проекта. Переходим в Project Interpreter:

Командой virtualenv ~/.virtualenvs/django-shop было установлено виртуальное окружение для проекта, поэтому проверьте, чтобы в поле Project Interpreter путь совпадал: 2.7.6 virtualenv at ~/.virtualenvs/django-shop. Найти этот путь можно щёлкнув на крайнюю справа стрелочку вниз этого поля. Если в списке нет пути до виртуального окружения, то можно его вручную добавить, щёлкнув на значок шестерёнки (правее стрелки влево):

Теперь закрываем окно настроек, и последнее что нам осталось сделать, это добавить конфигурацию запуска проекта. Для этого щёлкаем Edit Configuration:

И, щёкнув на плюсик, выбираем Django Server:

Теперь остаётся заполнить Environment variables по необходимости:

DJANGO_SHOP_TUTORIAL=commodity
DJANGO_DEBUG=True
DJANGO_SETTINGS_MODULE=myshop.settings

Имейте ввиду, что, если у вас в переменных окружения DJANGO_SETTINGS_MODULE=settings:

или в manage.py записан путь до settings.py неправильным образом:

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

if __name__ == '__main__':
    os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'settings')
    from django.core.management import execute_from_command_line
    execute_from_command_line(sys.argv)

вместо myshop.settings. То возникнет ошибка:

ImportError: No module named settings

Так как в переменных окружения значение переменной DJANGO_SETTINGS_MODULE должно быть равно правильному пути до settings.py. В нашем примере с Django Shop DJANGO_SETTINGS_MODULE=myshop.settings.

Оцените статью

4.8 из 5 (всего 5 оценок)

captcha
Отмеченные звёздочкой поля ( * ) являются обязательными для заполнения.

Спасибо за ваш отзыв!

После нажатия кнопки "Отправить" ваше сообщение будет доставлено мне на почту.

Автор статьи

Артём Мальцев

Веб-разработчик, владеющий знаниями языка программирования Python, фреймворка Django, системы управления содержимым сайта Django CMS, платформы для создания интернет-магазина Django Shop и многих различных приложений, использующих эти технологии.

Права на использование материала, расположенного на этой странице https://vivazzi.pro/ru/it/pycharm-rundebug-configuration/:

Разрешается копировать материал с указанием её автора и ссылки на оригинал без использования параметра rel="nofollow" в теге <a>. Использование:

Автор статьи: Артём Мальцев
Ссылка на статью: <a href="https://vivazzi.pro/ru/it/pycharm-rundebug-configuration/">https://vivazzi.pro/ru/it/pycharm-rundebug-configuration/</a>

Больше: Правила использования сайта

Представляю вашему вниманию книгу, написанную моим близким другом Максимом Макуриным: Секреты эффективного управления ассортиментом.

Книга предназначается для широкого круга читателей и, по мнению автора, будет полезна специалистам отдела закупок и логистики, категорийным и финансовым менеджерам, менеджерам по продажам, аналитикам, руководителям и директорам, в компетенции которых принятие решений по управлению ассортиментом.

Комментарии: 0

Вы можете оставить комментарий как незарегистрированный пользователь.

Но зарегистрировавшись, вы сможете:

  • получать оповещения об ответах
  • просматривать свои комментарии
  • иметь возможность использовать все функции разработанных сервисов

Для комментирования от своего имени войдите или зарегистрируйтесь на сайте Vuspace

Отправить

На данный момент нет специального поиска, поэтому я предлагаю воспользоваться обычной поисковой системой, например, Google, добавив "vivazzi" после своего запроса.

Попробуйте

Выберите валюту для отображения денежных единиц