Llevo un par de días intentando solucionar el error relativo de importación en mi proyecto sin éxito. Tengo el siguiente árbol de proyecto:
proj | |---__init__.py | |---lib | |---__init__.py | |---func.py | |---src | |---main.py el __init__.py es un archivo vacío.
el func.py contiene una función de impresión:
def hello_func(): print("Hello !!!") el main.py :
from ..lib import * hello_func()y cuando lo ejecuto recibo este error:
ImportError: attempted relative import with no known parent packagealguien se enfrento al mismo problema?
Quiero dar la solución primero. Puede intentar usar from lib import * y ejecutar /proj/__init__.py , funciona bien para mí.
El motivo del error no known parent package es que ejecuta /proj/src/main.py , que manifiesta que /proj/src es el paquete raíz. Básicamente, un paquete es para importar, no para ejecutar. Es decir, no debe ejecutar el código python en un paquete, sino que debe importarlo.
from ..lib import * a python que suba al directorio principal de main.py, allí encuentre lib e importe todo desde allí, es decir, desde el archivo de inicio vacío, por lo que tampoco sucederá nada. Tienes que cambiar esto a from ..lib import func; func.hello_func() . Esto todavía soplará con el mismo error. El error se debe a que Python no piensa en términos de directorios exactamente como dije anteriormente. Python solo buscará paquetes en el directorio de trabajo desde el que lo inició (y en la lista sys.path, pero no se meta con eso). Obtiene este error porque ejecuta su secuencia de comandos directamente desde src, por lo que para python, la raíz del "sistema de archivos" es src, no hay un paquete principal conocido (para python) (carpeta). Este es un antipatrón en python (ejecutando scripts desde su directorio). Lo que deberías estar haciendo en su lugar es
$ cd proj/.. $ python -m proj.src.main # note no .py Esto hace que la carpeta proj sea la "raíz" del sistema de archivos (para python) y python detectará todos los paquetes allí: src.main le dice a python que main.py es parte del paquete src que se detecta así como lib ( ya que son hijos directos de proj) y cuando realiza una importación relativa como en ..lib python ya conoce el paquete lib.