Tengo un proyecto que quiero estructurar así:
myproject __init__.py api __init__.py api.py backend __init__.py backend.py models __init__.py some_model.py
Ahora, quiero importar el módulo some_model.py
tanto en api.py
como en backend.py
. ¿Cómo hago esto correctamente?
Lo intenté:
from models import some_model
pero eso falla con ModuleNotFoundError: No module named 'models'
.
También probé:
from ..models import some_model
lo que me dio ValueError: attempted relative import beyond top-level package
.
¿Qué estoy haciendo mal aquí? ¿Cómo puedo importar un archivo de un directorio diferente, que no es un subdirectorio?
En primer lugar, esta declaración de importación:
from models import some_model
debe tener un espacio de nombres:
# in myproject/backend/backend.py or myproject/api/api.py from myproject.models import some_model
Luego, deberá obtener el directorio que contiene myproject
, llamemos a este /path/to/parent
, en la lista sys.path
. Puede hacer esto temporalmente configurando una variable de entorno:
export PYTHONPATH=/path/to/parent
O, preferiblemente, puede hacerlo escribiendo un archivo setup.py
e instalando su paquete. Siga la guía de embalaje de PyPA . Después de haber escrito su archivo setup.py
, desde el mismo directorio, ejecute esto para configurar las entradas correctas en sys.path
:
pip install --editable .
Desafortunadamente, Python solo encontrará su archivo si su archivo está en la ruta del sistema. ¡Pero no temas! ¡Hay una manera de evitar esto!
Usando el módulo sys
de python, podemos agregar un directorio a la ruta justo mientras Python se está ejecutando, y una vez que Python deje de ejecutarse, lo eliminará de la ruta.
Puedes hacer esto por:
import sys sys.path.insert(0, '/path/to/application/app/folder') import [file]
Sin embargo, es importante importar sys y configurar la ruta del directorio antes de importar el archivo.
¡Buena suerte!
Jordán.