from another python-3.x import module

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 invocar from proj import moduleA

Buena suerte con tu viaje a la increíble tierra de Python.