Подтвердить что ты не робот

Импорт модулей в Python и __init__.py

Я читал о функции файла __init__.py. Говорят, что нам нужен пустой файл __init__.py в папке, содержащей модули, чтобы эти модули можно было импортировать. Однако я попытался добавить путь к папке в PYTHONPATH (переменная среды в Windows 7). Хотя эта папка не содержит файла __init__.py, я все равно могу импортировать модули из этой папки. Не могли бы вы объяснить, как эти модули можно импортировать без существования __init__.py?

Спасибо,

С наилучшими пожеланиями

4b9b3361

Ответ 1

__init__.py превращает папку в package. Это полезно для создания своего рода иерархии модулей, где вы можете иметь import-statements следующим образом:

import mymodule.cool.stuff

Это невозможно без пакетов.

Ответ 2

Если каталог (папка) содержит файл __init__.py, то он становится пакетом. То, что, по вашему мнению, вы читали, было не совсем правильным, как вы нашли. Пакет можно импортировать, как если бы он был модулем сам по себе, и запускается любой код в __init__.py, хотя он часто пуст. Пакеты - это способ группировки нескольких модулей вместе, и их можно загрузить с помощью:

import package-name.module-name

Пакеты также могут быть вложенными и часто являются. Посмотрите в каталоге Lib в каталоге программного обеспечения Python для многих примеров.

Ответ 3

Разница между с _init_.py и не имеющей в каталоге вашего модуля:

Если у вас есть __init__.py (пустой), вы можете импортировать модуль, используя

from dirname import MyModule

Но если у вас вообще нет _init_.py, вы не можете импортировать модуль, не добавляя путь до этого модуля в PYTHONPATH. В этом случае from dirname import MyModule FAILS или сообщает об ошибке.

# Структура каталога/Модуль без _init_.py

[[email protected] python]# cd NoInitModule/
[[email protected] NoInitModule]# pwd
/python/NoInitModule
[[email protected] NoInitModule]# ls -l
total 4
-rw-r--r--. 1 root root 44 Jan 16 07:02 ModuleX.py

# Структура каталога/Модуль с _init_.py

[[email protected] NoInitModule]# cd ../InitModule/
[[email protected] InitModule]# ls -l
total 4
-rw-r--r--. 1 root root  0 Jan 16 07:13 __init__.py
-rw-r--r--. 1 root root 49 Jan 16 07:12 ModuleY.py
[[email protected] InitModule]#

<сильные > Примеры:

# NO _init_.py, из инструкции модуля импорта dir - НЕ РАБОТАЕТ

[[email protected] python]# cat impomod.py
from NoInitModule import ModuleX

ModuleX.printBye()

[[email protected] python]# python impomod.py
Traceback (most recent call last):
  File "impomod.py", line 7, in <module>
    from NoInitModule import ModuleX
ImportError: No module named NoInitModule
[[email protected] python]#

# NO _init_.py, оператор импорта - НЕ РАБОТАЕТ

[[email protected] python]# vim impomod.py
[[email protected] python]# cat impomod.py
#from NoInitModule import ModuleX
import ModuleX

ModuleX.printBye()
[[email protected] python]# python impomod.py
Traceback (most recent call last):
  File "impomod.py", line 8, in <module>
    import ModuleX
ImportError: No module named ModuleX
[[email protected] python]#

# NO _init_.py, путь INSERT в PYTHONPATH, инструкция модуля импорта после вставки пути - WORKS

[[email protected] python]# vim impomod.py
[[email protected] python]# cat impomod.py
import sys
sys.path.append('/python/NoInitModule')
print sys.path

import ModuleX
ModuleX.printBye()

[[email protected] python]# python impomod.py
Bye from Module X with no __init__.py
[[email protected] python]#

# HAVING _init_.py, нет INSERT пути, из инструкции модуля импорта dir - WORKS

[[email protected] python]# cat impXmod.py
import sys
from InitModule import ModuleY
ModuleY.printSeeU()
[[email protected] python]#

[[email protected] python]# python impXmod.py
See you from Module Y having __init__.py

# HAVING _init_.py, нет INSERT пути, инструкция модуля импорта - НЕ РАБОТАЕТ

[[email protected] python]# vim impXmod.py
[[email protected] python]# cat impXmod.py
import sys
#from InitModule import ModuleY
import ModuleY
ModuleY.printSeeU()

[[email protected] python]# python impXmod.py
Traceback (most recent call last):
  File "impXmod.py", line 3, in <module>
    import ModuleY
ImportError: No module named ModuleY

Конечно, проблема с подпапками может быть добавлена ​​к этому

Ответ 4

Да, это работает, как вы можете сказать. Причиной пустого файла __init__.py является отметка подпапок как папки, содержащие модули.

Итак, папка в PYTHONPATH в порядке, если в ней есть модули, но для любых подпапок этих папок в них должен быть файл __init__.py, чтобы иметь возможность импортировать из них модули.