Why?
Потому что вы запускаете скрипт по-другому. Когда вы запускаете его с PyCharm, PyCharm добавляет каталог проекта и все исходные каталоги в sys.path
. Вот почему import A.a
работает. Однако, когда вы запускаете ваш скрипт с консольной командой, к sys.path
добавляется только местоположение файла. Просто напечатайте sys.path
, чтобы увидеть, что в нем содержится.
Для решения этой проблемы вы можете использовать различные подходы.
Самый простой способ - использовать PYTHONPATH
. Например, на Windows вы можете запустить команду set PYTHONPATH=[project_folder];%PYTHONPATH%
, тогда import A.a
работает. Или вы можете запустить немного другую версию set PYTHONPATH=[project_folder/A];%PYTHONPATH%
, тогда import a
работает. По сути, эта команда добавляет каталог в sys.path
.
Альтернативное решение - использовать функцию main
в b.py
и некоторые launching_script.py
в project_folder
. Вместо запуска b.py
вы запускаете launching_script.py
. Таким образом, у вас всегда есть каталог проекта в sys.path
. Поэтому абсолютный импорт, начинающийся с каталога проекта (например, import A.a
), будет работать как в PyCharm, так и в консоли.
Другой подход - это некрасивый код, подобный следующему:
try:
import A.a as module_a
except ModuleNotFoundError:
import pathlib
import sys
sys.path.append(str(pathlib.Path(__file__).parent.parent))
import A.a as module_a
Также вы можете использовать относительный импорт. Немного сложнее, менее читабельным и подверженным ошибкам способом, требующим некоторой работы над структурой проекта.