Почему импорт файла из папки работает, а вызов файла из импортированной папки — нет?

#python #python-3.x #import #python-import

#python #python-3.x #импорт #python-импорт

Вопрос:

В настоящее время я работаю над проектом, в котором основной файл находится в каталоге вместе с подкаталогом с некоторыми дополнительными файлами:

 project
|- folder
|  |- __init__.py
|  |- file1.py
|  |- file2.py
|  |- file3.py
|- main.py
  

При пустом файле инициализации.

В моем случае я хотел бы импортировать все файлы в свой текущий main.py используя как можно меньше кода. Вот в чем загвоздка:

Работает

 from folder.file1 import somefunction1
from folder.file2 import somefunction2

somefunction1()
somefunction2()
  

Работает

 from folder import file1
from folder import file2

file1.somefunction1()
file2.somefunction2()
  

Не работает

 import folder
folder.file1.somefunction1()
folder.file2.somefunction2()

AttributeError: module 'folder' has no attribute 'file1'
  

Я понимаю значение сообщения об ошибке, но не совсем понимаю, почему оно возникает. В моем первом примере я могу вызвать folder .file и folder.file2 в качестве атрибутов, но в моем последнем примере я не могу?

К сожалению, я нашел только похожие вопросы о том, как импортировать файлы из папок в целом, но ничего об этой конкретной проблеме.

Что именно Python делает в фоновом режиме и есть ли способ исправить мою проблему?

Комментарии:

1. Что в вашем __init__.py ? Я думаю, что для того, чтобы 3-й работал, в __init__.py вы должны включить import file1 и import file2 .

2. В настоящее время он пуст, вставка import file1 дает мне ModuleNotFoundError: No module named 'file1' (и да, мой файл называется точно так же 🙂

Ответ №1:

Вам нужно добавить

 from . import file1
  

в вашем _init_.py
это приведет к помещению file1 в папку, к которой вы затем сможете получить доступ из main.py

Ответ №2:

в вашем init.py файл

 __all__ = ["file1","file2","file3"]
  

в main.py

 from folder import *

file1.somefunction1()

file2.somefunction2()