Для импорта, чтобы найти модуль, он должен быть либо в sys.path. Обычно это включает "", поэтому он ищет текущий каталог. Если вы загрузите «приложение» из проекта, оно найдет его, поскольку оно находится в текущем каталоге.
Хорошо, это очевидные вещи. Смущает то, что Python запоминает, какие модули загружены. Если вы загружаете приложение, то вы загружаете приложение2, которое импортирует приложение, модуль «приложение» уже загружен. Это не должно найти это на диске; он просто использует тот, который уже загружен. С другой стороны, если вы еще не загрузили приложение, оно будет искать его - и не найдет его, поскольку оно не находится в том же каталоге, что и его загрузка ("."), Или где-либо еще в путь.
Это может привести к странному случаю, когда импорт иногда работает, а иногда нет; он работает только если он уже загружен.
Если вы хотите иметь возможность загружать эти модули как просто «приложение», то вам нужно организовать добавление проекта / sys.path.
(Звук относительного импорта связан, но кажется, что application и application2 - это отдельные пакеты - относительный импорт используется для импорта в одном пакете.)
Наконец, обязательно последовательно относитесь ко всему как к пакету или последовательно относитесь к каждому приложению как к своему пакету. Не смешивать и сочетать. Если package / находится в пути (например, sys.path включает в себя package / ..), то вы действительно можете сделать «из пакета package.application import foo», но если вы затем также выполните «из приложения import foo», это возможно для Python, чтобы не понимать, что это одно и то же - их имена разные, и они идут разными путями - и в итоге загружают две разные его копии, которые вам определенно не нужны.