Tengo un proyecto estructurado así:
. └── myapp ├── app.py ├── models │ ├── hello.py │ └── world.py └── requirements.txt Tengo dos modelos, hello y world . Ambos modelos se usan desde app.py donde los importo así:
from models.hello import Hello from models.world import World Pero world también necesita usar hello . Intenté esto en world.py :
from models.hello import HelloLo anterior técnicamente funciona cuando ejecuto la aplicación, pero la extensión Python de VSCode me da el siguiente error:
E0401:Unable to import 'models.hello'.¿Cuál es la forma correcta de importar un submódulo desde el mismo directorio? ¿Cómo evito este error en VSCode?
El error que está recibiendo es uno que informa un linter de python llamado pylint . Entonces, el problema no es realmente específico de la extensión vscode.
Hay dos soluciones:
Intente agregar un archivo .env en el directorio de su proyecto con el vape PYTHONPATH=./myapp , esto le indicará a pylint dónde encontrar sus módulos
O simplemente abra la carpeta myapp en vscode directamente en lugar de abrir el directorio principal en vscode.
El error proviene de pylint. Debe agregar esta línea en el archivo settings.json (Código VS):
"python.linting.pylintArgs": ["--init-hook", "import sys; sys.path.append('<absolute path to myapp directory>')"],Dado que hello.py y world.py están en la misma carpeta (también conocido como paquete), debe importar la clase Hello en world.py de la siguiente manera:
from .hello import HelloComo se describe en este hilo: ¿Qué hace un . en una declaración de importación en Python significa?
el . está aquí para indicar la importación desde el paquete actual.