Почему Pycharm не может запустить код с относительным импортом? - PullRequest
0 голосов
/ 27 августа 2018

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

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 в конфигурации запуска:

enter image description here

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

EDIT : изменение рабочего каталога в конфигурации запуска на 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 Ответ

0 голосов
/ 27 августа 2018

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

enter image description here

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

...