Importaciones relativas – ModuleNotFoundError: ningún módulo llamado x

Esta es la primera vez que realmente me siento y pruebo Python 3, y parece que estoy fallando miserablemente. Tengo los siguientes dos archivos:

  1. test.py
  2. config.py

config.py tiene algunas funciones definidas en él así como algunas variables. Lo he reducido a lo siguiente:

introduzca la descripción de la imagen aquí

Sin embargo, estoy recibiendo el siguiente error:

ModuleNotFoundError: No module named 'config' 

Soy consciente de que la convención py3 es usar importaciones absolutas:

 from . import config 

Sin embargo, esto conduce al siguiente error:

 ImportError: cannot import name 'config' 

Así que no sé qué hacer aquí … Cualquier ayuda es muy apreciada. 🙂

TL; DR: no puede realizar importaciones relativas desde el archivo que ejecuta ya que el módulo __main__ no forma parte de un paquete.

Importaciones absolutas – importa algo disponible en sys.path

Importaciones relativas : importe algo relativo al módulo actual, debe ser parte de un paquete

Si está ejecutando ambas variantes exactamente de la misma manera, una de ellas debería funcionar. De todos modos, aquí hay un ejemplo que debería ayudarlo a comprender lo que está sucediendo, agreguemos otro archivo main.py con la estructura general de directorios como esta:

 . ./main.py ./ryan/__init__.py ./ryan/config.py ./ryan/test.py 

Y vamos a actualizar test.py para ver qué está pasando:

 # config.py debug = True # test.py print(__name__) try: # Trying to find module in the parent package from . import config print(config.debug) del config except ImportError: print('Relative import failed') try: # Trying to find module on sys.path import config print(config.debug) except ModuleNotFoundError: print('Absolute import failed') # main.py import ryan.test 

Vamos a ejecutar test.py primero:

 $ python ryan/test.py __main__ Relative import failed True 

Aquí “prueba” es el módulo __main__ y no sabe nada acerca de pertenecer a un paquete. Sin embargo, la import config debería funcionar, ya que la carpeta ryan se agregará a sys.path.

Vamos a ejecutar main.py en su lugar:

 $ python main.py ryan.test True Absolute import failed 

Y aquí la prueba está dentro del paquete “ryan” y puede realizar importaciones relativas. import config falla ya que las importaciones relativas implícitas no están permitidas en Python 3.

Espero que esto haya ayudado.

PD: si te quedas con Python 3 ya no hay necesidad en los archivos __init__.py .

Me lo imaginé. Muy frustrante, especialmente viniendo de python2.

Tienes que añadir un . al módulo, independientemente de si es relativo o absoluto.

He creado la configuración del directorio de la siguiente manera.

 /main.py --/lib --/__init__.py --/mody.py --/modx.py 

modx.py

 def does_something(): return "I gave you this string." 

mody.py

 from modx import does_something def loaded(): string = does_something() print(string) 

main.py

 from lib import mody mody.loaded() 

Cuando ejecuto main, esto es lo que pasa.

 $ python main.py Traceback (most recent call last): File "main.py", line 2, in  from lib import mody File "/mnt/c/Users/Austin/Dropbox/Source/Python/virtualenviron/mock/package/lib/mody.py", line 1, in  from modx import does_something ImportError: No module named 'modx' 

Corrí 2to3, y la salida principal fue esta

 RefactoringTool: Refactored lib/mody.py --- lib/mody.py (original) +++ lib/mody.py (refactored) @@ -1,4 +1,4 @@ -from modx import does_something +from .modx import does_something def loaded(): string = does_something() RefactoringTool: Files that need to be modified: RefactoringTool: lib/modx.py RefactoringTool: lib/mody.py 

Tuve que modificar la statement de importación de mody.py para arreglarlo

 try: from modx import does_something except ImportError: from .modx import does_something def loaded(): string = does_something() print(string) 

Luego volví a ejecutar main.py y obtuve el resultado esperado.

 $ python main.py I gave you this string. 

Por último, solo para limpiarlo y hacerlo portátil entre 2 y 3.

 from __future__ import absolute_import from .modx import does_something 

Establecer PYTHONPATH también puede ayudar con este problema.

Así es como se puede hacer en Windows.

set PYTHONPATH=.

Probado tu ejemplo

 from . import config 

tiene el siguiente SystemError:
/usr/bin/python3.4 test.py
Rastreo (llamadas recientes más última):
Archivo “test.py”, línea 1, en
desde . configuración de importación
SystemError: el módulo principal ” no está cargado, no puede realizar una importación relativa


Esto funcionará para mí:

 import config print('debug=%s'%config.debug) >>>debug=True 

Probado con Python: 3.4.2 – PyCharm 2016.3.2


Junto a este PyCharm te ofrece importar este nombre .
Tienes que hacer clic en config y aparece un icono de ayuda . introduzca la descripción de la imagen aquí

Este ejemplo funciona en Python 3.6.

Sugiero ir a Run -> Edit Configurations en PyCharm, eliminar cualquier entrada allí y tratar de ejecutar el código nuevamente a través de PyCharm.

Si eso no funciona, verifique el intérprete de su proyecto (Configuración -> Intérprete del proyecto) y ejecute los valores predeterminados de configuración (Ejecutar -> Editar configuraciones …).

Como se indicó en los comentarios a la publicación original, esto parecía ser un problema con el intérprete de python que estaba usando por cualquier razón, y no algo malo con los scripts de python. Cambié del paquete WinPython al python 3.6 oficial de python.org y funcionó bien. Gracias por la ayuda a todos 🙂