python-3.x - another - python import module from path
ModuleNotFoundError: no hay módulo llamado ''__main__. Xxxx''; ''__main__'' no es un paquete (2)
Actualmente estoy intentando trabajar en Python3 y usar importaciones absolutas para importar un módulo a otro, pero me ModuleNotFoundError: No module named ''__main__.moduleB''; ''__main__'' is not a package
el error ModuleNotFoundError: No module named ''__main__.moduleB''; ''__main__'' is not a package
ModuleNotFoundError: No module named ''__main__.moduleB''; ''__main__'' is not a package
. Considere la estructura de este proyecto:
proj
__init__.py3 (empty)
moduleA.py3
moduleB.py3
móduloA.py3
from .moduleB import ModuleB
ModuleB.hello()
móduloB.py3
class ModuleB:
def hello():
print("hello world")
Luego, ejecutando python3 moduleA.py3
da el error. ¿Qué necesita ser cambiado aquí?
¡Gracias!
Además de la respuesta de md-sabuj-sarker, hay un muy buen ejemplo en la documentación de los módulos de Python .
Esto es lo que dicen los documentos sobre intra-package-references :
Tenga en cuenta que las importaciones relativas se basan en el nombre del módulo actual. Dado que el nombre del módulo principal siempre es
"__main__"
, los módulos destinados a ser utilizados como el módulo principal de una aplicación de Python siempre deben utilizar importaciones absolutas.
Si ejecuta python3 moduleA.py3
, moduleA
se usa como módulo principal, por lo que usar la importación absoluta parece ser lo correcto.
Sin embargo, tenga en cuenta que esta importación absoluta ( from package.module import something
) falla si, por alguna razón, el paquete contiene un archivo de módulo con el mismo nombre que el paquete (al menos, en mi Python 3.7). Entonces, por ejemplo, fallaría si tiene (usando el ejemplo de OP):
proj/
__init__.py (empty)
proj.py (same name as package)
moduleA.py
moduleB.py
en cuyo caso obtendrías:
ModuleNotFoundError: No module named ''proj.moduleB''; ''proj'' is not a package
Alternativamente, puede eliminar el archivo .
from .moduleB import
, como se sugiere here y here , lo que parece funcionar, aunque mi PyCharm (2018.2.4) marca esto como una "referencia no resuelta" y no se puede completar automáticamente.
.moduleB
es una importación relativa. Relativo solo funciona cuando el módulo principal se importa o carga primero. Eso significa que necesita tener un proj
importado en algún lugar de su entorno de ejecución actual. Cuando está utilizando el comando python3 moduleA.py3
, no tiene posibilidad de importar el módulo principal. Usted puede:
-
from proj.moduleB import moduleB
OR - Puede crear otro script, digamos
run.py
, para invocarfrom proj import moduleA
Buena suerte con tu viaje a la increíble tierra de Python.