Моя структура пакета:
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 в конфигурации запуска:
Так почему 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'