Почему Pycharm не может запустить код с относительным импортом?

Моя структура пакета:

root_pkg
root_pkg/__init__.py # empty
root_pkg/game
root_pkg/game/__init__.py # empty
root_pkg/game/game1.py
root_pkg/utils
root_pkg/utils/__init__.py # empty
root_pkg/utils/lib.py

root_pkg/game/game1.py содержит:

"""File root_pkg/game/game1.py"""

from ..utils import lib

это не выдает никаких ошибок

Запуск этого в pycharm однако:

C:\_\Python363-64\python.exe C:/Dropbox/eclipse_workspaces/python/test_imports/root_pkg/game/game1.py
Traceback (most recent call last):
  File "C:/Dropbox/eclipse_workspaces/python/test_imports/root_pkg/game/game1.py", line 3, in <module>
    from ..utils import lib
ValueError: attempted relative import beyond top-level package

Process finished with exit code 1

Однако пути к содержимому и исходному тексту добавляются к пути Python в конфигурации запуска:

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

Так почему Пичарм не может запустить это? Разве он не должен добавить папку проекта в PYTHONPATH? Это правильный стиль импорта для использования?

РЕДАКТИРОВАТЬ: изменение рабочего каталога в конфигурации запуска на C:\Dropbox\eclipse_workspaces\python\test_imports\ приводит к той же ошибке:

C:\_\Python363-64\python.exe C:/Dropbox/eclipse_workspaces/python/test_imports/root_pkg/game/game1.py
Traceback (most recent call last):
  File "C:/Dropbox/eclipse_workspaces/python/test_imports/root_pkg/game/game1.py", line 3, in <module>
    from ..utils import lib
ValueError: attempted relative import beyond top-level package

Обратите внимание, что он работает нормально из командной строки, используя -m переключатель, так что PyCharm верен, если не выдает ошибку:

C:\Dropbox\eclipse_workspaces\python\test_imports>C:\_\Python363-64\python.exe -m root_pkg.game.game1

Меняя это на абсолютный импорт from utils import lib отображает ошибку в pycharm, а также не работает в командной строке:

C:\Dropbox\eclipse_workspaces\python\test_imports>C:\_\Python363-64\python.exe root_pkg/game/game1.py
Traceback (most recent call last):
  File "root_pkg/game/game1.py", line 3, in <module>
    from utils import lib
ModuleNotFoundError: No module named 'utils'

C:\Dropbox\eclipse_workspaces\python\test_imports>C:\_\Python363-64\python.exe -m root_pkg.game.game1
Traceback (most recent call last):
  File "C:\_\Python363-64\lib\runpy.py", line 193, in _run_module_as_main
    "__main__", mod_spec)
  File "C:\_\Python363-64\lib\runpy.py", line 85, in _run_code
    exec(code, run_globals)
  File "C:\Dropbox\eclipse_workspaces\python\test_imports\root_pkg\game\game1.py", line 3, in <module>
    from utils import lib
ModuleNotFoundError: No module named 'utils'

1 ответ

Добавление root_pkg чтобы исходные папки заставили работать конфигурацию запуска (и PyCharm не выдает ошибку при абсолютном импорте).

Печать sys.path показывает, что PyCharm добавил абсолютный путь к root_pkg там пока не добавляются подпапки контента root. Что меня смутило, так это то, что он разрешил относительное импортное право, в то время как он допустил ошибку в абсолютном, хотя оба не могли быть решены во время выполнения.

Другие вопросы по тегам