Hay algunos conceptos erróneos importantes que deben abordarse, específicamente con la terminología. Primero, generalmente, cuando piensas que estás importando un package
en python, lo que estás realmente importando es un module
. Debería usar el término package
cuando piense en términos de subestructura del sistema de archivos que lo ayude a organizar su código. Pero desde la perspectiva del código, cada vez que importa un package
, Python lo trata como un módulo. Todos los paquetes son módulos. No todos los módulos son paquetes. Un módulo con el atributo __path__
se considera un paquete.
Puede verificar que os
es un módulo. Para confirmar esto se puede hacer:
import os
print(type(os)) # will print: <type 'module'>
En su ejemplo, cuando se hace import FooPackage
, FooPackage
se trata y se considera que es un módulo también, y sus atributos (funciones, clases, etc.) están supuestamente define en __init__.py
. Como su __init__.py
está vacío, no puede encontrar foo
.
Fuera de las declaraciones import
no se puede usar la notación '.'
para direccionar los módulos dentro de los módulos. La única excepción ocurre si se importa un archivo module
en el paquete del padre previsto __init__.py
. Para que quede claro, vamos a hacer algunos ejemplos aquí:
Tenga en cuenta su estructura original:
FooPackage/
__init__.py
foo.py
Caso 1: __init__.py es un archivo vacío
#FooPackage imported as a module
import FooPackage
#foo is not a name defined in `__init__.py`. Error
FooPackage.foo
#FooPackage.foo imported as a module
import FooPackage.foo
#Error, foo has not been imported. To be able to use foo like this,
#you need to do: import FooPackage.foo as foo
foo.anything
#Not error, if anything is defined inside foo.py
FooPackage.foo.anything
Caso 2: __init__.py tiene la línea import foo
en él:
import FooPackage
#Now this is good. `foo` is sort of considered to be an attribute of
#FooPackage
FooPackage.foo
Supongamos que foo ya no es un module
, sino un function
que usted define en __init__.py
. si lo hace import FooPackage.foo
, arrojará un error diciendo que foo
no es un módulo.
Según entendí, la pregunta no era cómo importar un submódulo, era por eso que se podía acceder a un submódulo de os sin importar ese submódulo, y cómo implementar algo similar. Editar: Sin embargo, su respuesta funcionaría – pycoder112358