Ответ 1
__init__.py
превращает папку в package. Это полезно для создания своего рода иерархии модулей, где вы можете иметь import-statements следующим образом:
import mymodule.cool.stuff
Это невозможно без пакетов.
Я читал о функции файла __init__.py
. Говорят, что нам нужен пустой файл __init__.py
в папке, содержащей модули, чтобы эти модули можно было импортировать. Однако я попытался добавить путь к папке в PYTHONPATH (переменная среды в Windows 7). Хотя эта папка не содержит файла __init__.py
, я все равно могу импортировать модули из этой папки. Не могли бы вы объяснить, как эти модули можно импортировать без существования __init__.py
?
Спасибо,
С наилучшими пожеланиями
__init__.py
превращает папку в package. Это полезно для создания своего рода иерархии модулей, где вы можете иметь import-statements следующим образом:
import mymodule.cool.stuff
Это невозможно без пакетов.
Если каталог (папка) содержит файл __init__.py
, то он становится пакетом. То, что, по вашему мнению, вы читали, было не совсем правильным, как вы нашли. Пакет можно импортировать, как если бы он был модулем сам по себе, и запускается любой код в __init__.py
, хотя он часто пуст. Пакеты - это способ группировки нескольких модулей вместе, и их можно загрузить с помощью:
import package-name.module-name
Пакеты также могут быть вложенными и часто являются. Посмотрите в каталоге Lib в каталоге программного обеспечения Python для многих примеров.
Разница между с _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
Конечно, проблема с подпапками может быть добавлена к этому
Да, это работает, как вы можете сказать. Причиной пустого файла __init__.py
является отметка подпапок как папки, содержащие модули.
Итак, папка в PYTHONPATH в порядке, если в ней есть модули, но для любых подпапок этих папок в них должен быть файл __init__.py
, чтобы иметь возможность импортировать из них модули.