Как отлаживать пакет Python в PyCharm

Настройка

В моем проекте есть следующая древовидная структура:

Cineaste/
├── cineaste/
│   ├── __init__.py
│   ├── metadata_errors.py
│   ├── metadata.py
│   └── tests/
│       └── __init__.py
├── docs/
├── LICENSE
├── README.md
└── setup.py

metadata.py импортирует metadata_errors.py с выражением:

from .metadata_errors.py import *

Таким образом, установите относительный путь к модулю в том же каталоге (обратите внимание на префикс точки).

Я могу запустить metadata.py в редакторе PyCharm 2016 просто отлично со следующей конфигурацией:

введите описание изображения здесь

Проблема

Однако с этой конфигурацией я не могу отлаживать metadata.py. PyCharm возвращает следующее сообщение об ошибке (частичная трассировка стека):

    from .metadata_errors import *
SystemError: Parent module '' not loaded, cannot perform relative import

Отладчик PyCharm вызывается так:

/home/myself/.pyenv/versions/cineaste/bin/python /home/myself/bin/pycharm-2016.1.3/helpers/pydev/pydevd.py --multiproc --module --qt-support --client 127.0.0.1 --port 52790 --file cineaste.metadata

Вопрос

Как мне настроить этот проект, чтобы PyCharm мог запускать и отлаживать файл, делающий относительный импорт?

Ответы

Ответ 1

Одним из возможных решений может быть запуск вашего модуля с помощью промежуточного script, который вы будете запускать в режиме отладки. Например. test_runner.py:

import runpy
runpy.run_module('cineaste.metadata')

Ответ 2

Вы также можете попробовать удалить последний node (/cineaste) из рабочего каталога. Эта конфигурация работает (запускается и отлаживается) для меня (в Pycharm: 2017.2.2)

введите описание изображения здесь

Ответ 3

Я знаю, что этот вопрос задавался много лет назад, но я пришел сюда сегодня. Может быть, кто-то также попытается найти ответ позже.

Сегодня (PyCharm 2018.3) это действительно просто, но не очевидно. Вы можете выбрать цель для запуска: имя скрипта или имя модуля, нажав метку "Путь скрипта" в окне редактирования конфигурации:

Окно редактирования конфигурации

Ответ 4

Я бы предложил не использовать *, так как это может вызвать много проблем в будущем, два класса или методы будут названы одинаковыми и т.д.