Estoy usando Python 3.5.1. Leí el documento y la sección del paquete aquí: https://docs.python.org/3/tutorial/modules.html#packages
Ahora, tengo la siguiente estructura:
/home/wujek/Playground/a/b/module.py
module.py
:
class Foo:
def __init__(self):
print('initializing Foo')
Ahora, mientras que en /home/wujek/Playground
:
~/Playground $ python3
>>> import a.b.module
>>> a.b.module.Foo()
initializing Foo
<a.b.module.Foo object at 0x100a8f0b8>
Del mismo modo, ahora en casa, supercarpeta de Playground
:
~ $ PYTHONPATH=Playground python3
>>> import a.b.module
>>> a.b.module.Foo()
initializing Foo
<a.b.module.Foo object at 0x10a5fee10>
En realidad, puedo hacer todo tipo de cosas:
~ $ PYTHONPATH=Playground python3
>>> import a
>>> import a.b
>>> import Playground.a.b
¿Por qué funciona esto? Pensé que tenía que haber __init__.py
archivos (los vacíos funcionarían) en ambos a
y b
para module.py
poder ser importados cuando la ruta de Python apunta a la Playground
carpeta.
Esto parece haber cambiado desde Python 2.7:
~ $ PYTHONPATH=Playground python
>>> import a
ImportError: No module named a
>>> import a.b
ImportError: No module named a.b
>>> import a.b.module
ImportError: No module named a.b.module
Con __init__.py
en ambos ~/Playground/a
y ~/Playground/a/b
funciona bien.
fuente
Zen Of Python
línea 2:Explicit is better than implicit.
....__init__.py
, a veces no. En Python 3, cuando necesito estas cosas, creo una nueva__init__.py
con código específico, de lo contrario no lo hago. Esto resulta útil para saber, visualmente, qué paquetes tienen un inicio personalizado. En cambio, en Python 2 siempre tengo que colocar un__init__.py
(a menudo vacío), haciendo un gran número de ellos y, finalmente, más difícil de recordar dónde colocó su código de inicio. Esto también debería encajar "Debe haber una, y preferiblemente solo una, forma obvia de hacerlo".IMPORTANTE
La respuesta de @ Mike es correcta pero demasiado imprecisa. Es cierto que Python 3.3+ admite paquetes de espacio de nombres implícitos que le permite crear un paquete sin un
__init__.py
archivo.Sin embargo, esto SOLO se aplica a los archivos VACÍOS
__init__.py
. Por lo tanto, los archivos VACÍOS__init__.py
ya no son necesarios y pueden omitirse. Si desea ejecutar un script de inicialización particular cuando se importa el paquete o cualquiera de sus módulos o subpaquetes, aún necesita un__init__.py
archivo. Esta es una excelente respuesta de Stack Overflow para__init__.py
saber por qué desea utilizar un archivo para realizar una inicialización adicional en caso de que se pregunte por qué esto es de alguna manera útil.Ejemplo de estructura de directorio:
parent_package/child_package/__init__.py
:EJEMPLOS
Los siguientes ejemplos demuestran cómo se ejecuta el script de inicialización cuando
child_package
se importa uno o sus módulos.Ejemplo 1 :
Ejemplo 2 :
fuente
run_script.py
en el mismo directorio,parent_package
así que ¿puedo importar comofrom parent_package.child_package import child1
sin__init__.py
?child1.py
, enchild2.py
lugar de simplemente poner su código en__init__
.py directamente.__init__
importaciones relativas, es decirfrom . import child1
? La importación absoluta me daModuleNotFoundError
(en Python 3.6)__init__.py
todavía se necesita un vacío a veces, como cuando quieres referir una subcarpeta como un paquete. Por ejemplo, si lo ejecutopython -m test.foo
no funcionará hasta que haya creado un vacío__init__.py
debajo de la carpeta de prueba. ¡Y estoy hablando de la versión 3.6.6 aquí!Si tiene
setup.py
en su proyecto y lo usafind_packages()
dentro de él, es necesario tener un__init__.py
archivo en cada directorio para que los paquetes se encuentren automáticamente.UPD : si desea usar paquetes de espacio de nombres implícitos sin
__init__.py
tener que usarlosfind_namespace_packages()
en su lugarDocs
fuente
Yo diría que uno debería omitir el
__init__.py
único si quiere tener el paquete de espacio de nombres implícito . Si no sabe lo que significa, probablemente no lo quiera y, por lo tanto, debe continuar utilizando el__init__.py
par en Python 3.fuente