Tengo una situación simple en un sistema Linux:
ls test_repo
example __init__.py text
En el directorio text
, solo tengo 2 archivos:
__init__.py ex.py
En el directorio example
, tengo solo 2 archivos nuevamente:
__init__.py test.py
En ex.py
tengo el código:
def test():
print(10)
Ahora, en el directorio de texto, quiero importarlo:
from text.ex import test
print(test())
Pero cuando ejecuto el archivo en el directorio de ejemplo, así como fuera de él: python test.py
Recibo el error:
Traceback (most recent call last):
File "test.py", line 1, in <module>
from text.ex import test
ModuleNotFoundError: No module named 'text'
¿Cómo puedo importar la función?
¿Debo poner algo en __init__.py
?
3 respuestas
Para todos los que tengan este problema de importación, déjenme explicarles cómo funciona
Primero cuando importa cierto módulo a un archivo, ¿cómo sabe dónde encontrar el módulo? cuando importamos el módulo, Python verifica ese módulo en varias ubicaciones. Estas ubicaciones están en sys.path
. Si imprime sys.path
, dará una lista de ubicaciones donde Python verifica cuando ejecutamos una declaración import
. en la salida de mi máquina se ve así
¿Cuáles son los valores en esta lista?
- el primer valor es solo el directorio donde se ejecuta mi script actual
- Los siguientes valores son directorios listados en la variable de entorno de la ruta de Python
- Directorios de bibliotecas estándar
- directorio de paquetes del sitio para paquetes de terceros
Entonces, Python verifica todas estas ubicaciones cuando ejecutas una importación.
Cuando ejecuta python test.py
dentro del directorio de ejemplo, esto es lo que sucede
- Python agrega la ubicación donde su script actual se ejecuta en la lista
sys.path
(que estest_repo/example
) - El archivo
test.py
tiene una declaración de importación del módulotext.ex
- Python busca en toda la lista
sys.path
para cargar el módulotext.ex
- dado que el archivo
ex.py
está dentro del módulotest_repo/text
ysys.path
no tiene la ubicación para eltest_repo/text
, dará el error Ningún módulo llamado 'texto'
En su caso, puede agregar esto en la línea inicial de su test.py
import sys
sys.path.insert(0, "..")
Debido a que su test.py
está ubicado dentro del directorio example
, no en el directorio root
.
Mire esta pregunta, en StackOverflow. Tiene varios ejemplos para importar archivos, así que solo use el que mejor se adapte a su situación.
Preguntas relacionadas
Preguntas vinculadas
Nuevas preguntas
python
Python es un lenguaje de programación multipropósito, de tipificación dinámica y de múltiples paradigmas. Está diseñado para ser rápido de aprender, comprender y usar, y hacer cumplir una sintaxis limpia y uniforme. Tenga en cuenta que Python 2 está oficialmente fuera de soporte a partir del 01-01-2020. Aún así, para preguntas de Python específicas de la versión, agregue la etiqueta [python-2.7] o [python-3.x]. Cuando utilice una variante de Python (por ejemplo, Jython, PyPy) o una biblioteca (por ejemplo, Pandas y NumPy), inclúyala en las etiquetas.