Почему 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. Что меня смутило, так это то, что он разрешил относительное импортное право, в то время как он допустил ошибку в абсолютном, хотя оба не могли быть решены во время выполнения.