A partir de los documentos:
se puede ver esto:
importaciones en relación con el uso nombre atributo de un módulo para determinar la posición de ese módulo en la jerarquía de paquetes . Si el nombre del módulo no contiene información del paquete (por ejemplo, está configurado en 'principal'), las importaciones relativas se resuelven como si el módulo fuera un módulo de nivel superior, independientemente de dónde esté ubicado realmente el módulo en el sistema de archivos.
Al ejecutarlo como python moduleX.py
, está haciendo exactamente lo anterior. En su lugar, intente esto:
python -m package.subpackage1.moduleX
Esto importará moduleX y colocará el nivel superior en el paquete. Ejecutar desde la parte superior de la jerarquía:
package/
__init__.py
subpackage1/
__init__.py
moduleX.py
moduleY.py
subpackage2/
__init__.py
moduleZ.py
moduleA.py
es decir, en su caso desde c:\
directamente:
c:\>python -m package.subpackage1.moduleX
Nota una cosa - las importaciones en moduleX.py
son estos:
from .moduleY import spam
from .moduleY import spam as ham
from . import moduleY
from ..subpackage1 import moduleY
from ..subpackage2.moduleZ import eggs
from ..moduleA import foo
from ...package import bar
from ...sys import path
La segunda para durar:
from ...package import bar
requiere que la carpeta raíz (c:\
en su caso) sea un paquete (es decir tener __init__.py
). Además, requiere una variable de barra definida en package\__init__.py
, que actualmente no está allí (entonces ponga bar = 'bar!'
allí para la prueba).También requiere que esté un nivel arriba, por lo que debe colocar la carpeta package
en otra carpeta (para que termine con c:\toppackage\package
) y ejecutar c:\python -m toppackage.package.subpackage1.moduleX
.
Para esta línea:
from ...sys import path
hay una nota en la anterior PEP 328 enlace:
Tenga en cuenta que mientras que el último caso es legal, es ciertamente desanimado ("loco" fue el palabra que Guido usó).
Ver también otros SOqs sobre esto que podrían ayudar:
Espero que esto ayude.
Me parece que esta Q & A es más útil que la que se ha marcado como duplicada. – ArtOfWarfare
Robot duplicado taggers ;-) – nicorellius