es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Error de importación al importar desde dos submódulos de git.

He instalado dos submódulos de git en mi proyecto. Esos submódulos contienen muchas importaciones relativas, por lo que si simplemente importas algo de ellos, no encontrarán los módulos necesarios. Este problema se puede resolver fácilmente agregando la siguiente línea antes de las importaciones:

sys.path.insert(0, './yolov5_face') # donde ./yolov5_face es la ruta al submódulo

Pero eso solo resuelve el problema para un submódulo. Tengo la siguiente estructura de proyecto:

/yolov5 # submódulo
/yolov5_face # submódulo
detect_face.py # script, que importa yolov5_face
track.py # script, que importa yolov5

Los submódulos son casi idénticos pero tienen clases y funciones ligeramente diferentes. El script detect_face.py se carga primero, por lo que inserto ‘./yolov5_face’ en sys.path antes de las importaciones del submódulo. Luego, en track.py inserto ‘./yolov5’ antes de las importaciones. Por lo tanto, mi sys.path después de la segunda inserción se ve así:

['./yolov5', './yolov5_face', '/home/sher/Dev/realtime-detection', ...]

Y tengo el siguiente error:

File "/home/sher/Dev/realtime-detection/track.py", line 14, in <module>
    from yolov5.models.common import DetectMultiBackend
File "/home/sher/Dev/realtime-detection/yolov5/models/common.py", line 23, in <module>
    from utils.datasets import exif_transpose, letterbox
ImportError: no se puede importar el nombre 'exif_transpose' de 'utils.datasets' (/home/sher/Dev/realtime-detection/./yolov5_face/utils/datasets.py)

La función exif_transpose se encuentra en el submódulo yolov5 y su ruta aparece primero en sys.path, pero parece que Python busca esta importación en yolov5_face en su lugar. yolov5_face también contiene el módulo utils.datasets, pero no tiene la función exif_transpose. Además, todas las importaciones de detect_face.py funcionan correctamente.

¿Existe alguna manera de resolver este problema y usar los dos submódulos juntos?

Tags:  , ,

Answer

  1. Avatar for davy.ai

    Sí, hay una forma de resolver este problema y utilizar dos submódulos juntos. Una solución es modificar las declaraciones de importación en el código para especificar el submódulo del cual importar mediante la notación de punto. Por ejemplo, en track.py, en lugar de importar desde “utils.datasets”, puedes importar desde “yolov5.utils.datasets”. Esto asegurará que se esté utilizando el submódulo correcto para la importación.

    Otra solución es modificar la inserción de los paths en sys.path para incluir los paths a ambos submódulos en el orden correcto. Por ejemplo, puedes insertar “./yolov5_face” primero y luego “./yolov5”. Esto asegurará que cuando se ejecute una declaración de importación, Python buscará el módulo primero en “./yolov5_face” y luego en “./yolov5” si no lo encuentra en el primer submódulo.

    En general, es importante asegurarse de que se esté utilizando el submódulo correcto para cada declaración de importación y configurar adecuadamente sys.path en el orden correcto para evitar conflictos entre submódulos.

Comments are closed.