Импорт модулей в Python и __init__.py - PullRequest
26 голосов
/ 06 мая 2011

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

Спасибо,

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

Ответы [ 4 ]

18 голосов
/ 06 мая 2011

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

import mymodule.cool.stuff

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

9 голосов
/ 16 января 2014

Разница между , имеющим _ init _. Py и , не имеющим единицу в каталоге модулей:

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

from dirname import MyModule

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

# Структура каталога / модуля без _ init _.py

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

# Структура каталога / модуля с _ init _. py

[root@Machine NoInitModule]# cd ../InitModule/
[root@Machine 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
[root@Machine InitModule]#

Примеры:

# NO _ init _. Py, из оператора модуля импорта dir - НЕ РАБОТАЕТ

[root@Machine python]# cat impomod.py
from NoInitModule import ModuleX

ModuleX.printBye()

[root@Machine 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
[root@Machine python]#

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

[root@Machine python]# vim impomod.py
[root@Machine python]# cat impomod.py
#from NoInitModule import ModuleX
import ModuleX

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

# NO _ init _.py, INSERT путь в PYTHONPATH, импортировать оператор модуля после вставки пути - РАБОТАЕТ

[root@Machine python]# vim impomod.py
[root@Machine python]# cat impomod.py
import sys
sys.path.append('/python/NoInitModule')
print sys.path

import ModuleX
ModuleX.printBye()

[root@Machine python]# python impomod.py
Bye from Module X with no __init__.py
[root@Machine python]#

# HAVING _ init _. py, Нет INSERT пути, изоператор модуля импорта dir - РАБОТАЕТ

[root@Machine python]# cat impXmod.py
import sys
from InitModule import ModuleY
ModuleY.printSeeU()
[root@Machine python]#

[root@Machine python]# python impXmod.py
See you from Module Y having __init__.py

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

[root@Machine python]# vim impXmod.py
[root@Machine python]# cat impXmod.py
import sys
#from InitModule import ModuleY
import ModuleY
ModuleY.printSeeU()

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

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

9 голосов
/ 06 мая 2011

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

import package-name.module-name

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

6 голосов
/ 06 мая 2011

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...