Ответ 1
Одним из возможных решений может быть запуск вашего модуля с помощью промежуточного script, который вы будете запускать в режиме отладки. Например. test_runner.py:
import runpy
runpy.run_module('cineaste.metadata')
В моем проекте есть следующая древовидная структура:
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 мог запускать и отлаживать файл, делающий относительный импорт?
Одним из возможных решений может быть запуск вашего модуля с помощью промежуточного script, который вы будете запускать в режиме отладки. Например. test_runner.py:
import runpy
runpy.run_module('cineaste.metadata')
Вы также можете попробовать удалить последний node (/cineaste) из рабочего каталога. Эта конфигурация работает (запускается и отлаживается) для меня (в Pycharm: 2017.2.2)
Я знаю, что этот вопрос задавался много лет назад, но я пришел сюда сегодня. Может быть, кто-то также попытается найти ответ позже.
Сегодня (PyCharm 2018.3) это действительно просто, но не очевидно. Вы можете выбрать цель для запуска: имя скрипта или имя модуля, нажав метку "Путь скрипта" в окне редактирования конфигурации:
Я бы предложил не использовать *
, так как это может вызвать много проблем в будущем, два класса или методы будут названы одинаковыми и т.д.