Mi estructura de archivos es la siguiente:

monitor/
    core/
        database.py
        processor.py
        timekeeper.py
    jobs/
        jobA.py
        jobB.py
    setup.py

Desde jobA.py importo así:

from core.database import Database
from core.timekeeper import Timekeeper 
from core.processor import Processor

Mientras estoy en database.py, processor.py y timekeeper.py importo setup.py.


Recibo el siguiente error cuando ejecuto jobA.py:

root@test:/var/www/python/monitor# python3 jobs/jobA.py 
Traceback (most recent call last):
  File "jobs/jobA.py", line 2, in <module>
    from core.database import Database
ModuleNotFoundError: No module named 'core'
0
Borsn 3 oct. 2019 a las 22:53

4 respuestas

La mejor respuesta

Para permitir import core o import core.database (sin los puntos o dobles puntos relativos), el directorio padre de core debe ser el directorio actual o estar incluido en sys.path. Parece que tienes un setup.py. Convencionalmente, eso significa un archivo que realiza tareas de instalación y empaquetado a través de los paquetes setuptools o distutils. Si ese es realmente el rol que desempeña, tal vez necesite ejecutarlo. Una forma de ejecutarlo sería emitir (desde la línea de comandos fuera de Python) el comando pip install -e /path/to/monitor. Suponiendo que setup.py se escribió correctamente, esto garantizará que el paquete core, en su ubicación actual, esté disponible de forma duradera para la distribución predeterminada de Python. La próxima vez que inicie Python, /path/to/monitor estará en sys.path y import core funcionará (casi) en cualquier lugar.

1
jez 3 oct. 2019 a las 20:15

¿Qué módulo estás tratando de usar? Quizás su módulo no sea compatible con Python 3.

-2
flpec 3 oct. 2019 a las 19:59

Desde esta respuesta, puede usar 2 puntos para importar desde un directorio de arriba. Por lo tanto, podría usar:

from .core.database import Database
from .core.timekeeper import Timekeeper 
from .core.processor import Processor

Python 3.3+ no necesita un archivo __init__.py, así que no creo que solo agregar uno ayude.

0
Jab 3 oct. 2019 a las 20:08

Añadir

import os, sys
sys.path.append(os.path.dirname(os.path.dirname(os.path.abspath(__file__))))

Al principio de tu archivo jobA.py. Si está utilizando Python 3.3+, no necesita un archivo __init__.py. Debe estar por encima de sus otras declaraciones import.

0
Mason Caiby 3 oct. 2019 a las 20:07
58226051