2011-05-06 57 views
26

He estado leyendo acerca de la función del archivo __init__.py. Se dice que necesitamos un archivo __init__.py vacío en la carpeta que contiene módulos, para que estos módulos puedan importarse. Sin embargo, traté de agregar una ruta de carpeta a PYTHONPATH (variable de entorno en Windows 7). Aunque esta carpeta no contiene un archivo __init__.py, aún puedo importar los módulos desde esa carpeta. ¿Podría explicar cómo se pueden importar estos módulos sin la existencia de un __init__.py?Importación de módulos en Python y __init__.py

Gracias,

Saludos

Respuesta

18

__init__.py se convierte en una carpeta en un package. Esto es útil para crear una especie de jerarquía de módulos, donde se puede tomar de importación-declaraciones como esta:

import mymodule.cool.stuff 

Esto no es posible sin paquetes.

+0

Ok, supongamos que hay una carpeta: "A". Y "A" tiene un '__init __. Py'. Pero "A" no está en PYTHONPATH. ¿Puedo importar un módulo desde la carpeta "A"? ¿Python busca todas las carpetas en mi computadora para saber si tienen "' __init __. Py' "s en ellas? Quiero decir, ¿cómo sabe Python el camino a "A"? – alwbtc

+5

@steve: Aún debe agregar la ruta del paquete a su 'PYTHONPATH'. Python no busca en toda su computadora carpetas que contengan '__init __. Py'. –

9

Si un directorio (carpeta) contiene un archivo __init__.py se convierte en un paquete . Lo que creías leer no era estrictamente correcto, como descubriste. Un paquete puede importarse como si fuera un módulo por sí mismo, y se ejecuta cualquier código en __init__.py, aunque a menudo está vacío. Los paquetes son una forma de agrupar varios módulos entre sí, y se puede cargar usando:

import package-name.module-name 

Los paquetes también se pueden anidar, y con frecuencia son. Busca en el directorio Lib en tu directorio de software de Python para ver muchos ejemplos.

6

Sí, esto funciona, como puede ver. La razón para el archivo __init__.py vacío es marcar subcarpetas como carpetas que contienen módulos.

Por lo tanto, una carpeta en PYTHONPATH puede tener módulos, pero cualquier subcarpeta de esas carpetas debe tener un archivo __init__.py para poder importar módulos desde ellas.

+1

'__init __. Py' no * tiene * que estar vacío. –

+0

@Ignacio: Tampoco tiene que tener algo en ella si su única tarea es marcar una carpeta como si tuviera módulos. El OP mencionó archivos vacíos '__init __. Py'. – quamrana

9

La diferencia entre tener _ init _.py y no tener uno en su directorio de módulos es:

Cuando tiene__init__.py (en blanco uno), puede importar el módulo usando

from dirname import MyModule 

Pero cuando no tiene _ init _.py en absoluto, no puede importar el módulo sin agregar la ruta hasta ese módulo a PYTHONPATH. En este casofrom dirname import MyModuleFAILS, o informa error.

# Estructura del directorio/Módulo sin _ 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 

# Estructura del directorio/módulo con 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]# 

Ejemplos:

# NO _ init _.py , desde la declaración del módulo de importación de dir: NO FUNCIONA

[[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, la declaración de importación - NO FUNCIONA

[[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, Insertar ruta en PYTHONPATH, importar la instrucción del módulo después de insertar la ruta - OBRAS

[[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, sin inserción de ruta, de la declaración módulo de importación 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 

# TIENE _ init _.py, sin inserción de ruta, la importación declaración módulo - NO FUNCIONA

[[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 

Por supuesto, cuestión subcarpetas se puede añadir a esta

Cuestiones relacionadas