La documentación que engañó como está escrito para describir el caso más común de importación un módulo desde fuera del paquete principal que lo contiene.
Por ejemplo, usando "desde el submódulo de importación de ejemplo" en mi propio código, donde "ejemplo" es una biblioteca de terceros completamente desconectada de mi propio código, no vincula el nombre "ejemplo". Todavía importa ambos los módulos example/__ init__.py y example/submodule.py, crea dos objetos de módulo y asigna example.submodule al segundo objeto de módulo.
Pero, "from..import" de nombres de un submódulo debe establecer el atributo de submódulo en el objeto de paquete principal. Considere si no lo hizo:
paquete/__ init__.py se ejecuta cuando se importa el paquete.
That __init__ does "from submodule import name".
En algún momento posterior, otro código completamente diferente "import package package.submodule".
En el paso 3, ya sea sys.modules [ "package.submodule"] no existe, en cuyo caso la carga de nuevo le dará dos objetos de módulo diferentes en diferentes ámbitos; o sys.modules ["paquete.submódulo "] existirá pero" submódulo "no será un atributo del objeto del paquete primario (sys.modules [" paquete "]), y" import package.submodule "no hará nada. Sin embargo, si no hace nada, el código mediante la importación no puede acceder submódulo como un atributo de paquete!
en teoría, la forma en la importación funciona un submódulo podría ser cambiado si el resto de la maquinaria de importación fue cambiado para que coincida.
Si sólo necesita para saber qué importará un submódulo S del paquete P, en pocas palabras:
- Asegúrese de que P se importe, o impórtelo de lo contrario. (Este paso se repite para manejar "importar A.B.C.D").
- Ejecute S.py para obtener un objeto de módulo. (Omitir detalles de archivos .pyc, etc.)
- Almacenar objeto de módulo en sys.modules ["P.S"].
setattr(sys.modules["P"], "S", sys.modules["P.S"])
- Si esa importación era del tipo "importar P.S", enlaza "P" en el ámbito local.
¿Está seguro de que no hay 'import moduleB' antes de eso? – JBernardo
Sí, estoy seguro. Esos son los archivos completos sobre los que se puede reproducir la situación. – yole
Lo intenté y funciona en Python2.7 pero no en Python3.2 ... – JBernardo