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.

¿Cómo puedo importar un archivo de python a través de una ruta?

Estoy tratando de lograr que se ejecute la versión más nueva de la lista cuando se ejecute este código.

Aquí está el directorio que quiero:

ClockOS:
   bootLoader.py (el archivo desde el cual estoy comenzando)
   Versions:
      Version 0.1.1:
         main.py (ignorar porque es una versión anterior)
      Version 0.1.2:
         main.py (la que quiero ejecutar/importar)

He intentado cargarlo a través de os.dir, y usando sys.path, y agregando un archivo vacío __init__.py.
¿Alguien sabe cómo hacer que esto funcione?
Mi código:

import os
import re
import sys

versionList = []

for filename in os.listdir('Versions'):
    if filename.startswith('Version'):
        versionList.append(filename)
        print(f"Loaded {filename}")

def major_minor_micro(version):
    major, minor, micro = re.search('(\d+).(\d+).(\d+)', version).groups()
    return int(major), int(minor), int(micro)

latest = str(max(versionList, key=major_minor_micro))
print("Newest Version: ", latest)

os.path.dirname('Versions/'+str(latest))

sys.path.insert(1, latest)
print(sys.path)

import main

Por último, necesito que esto funcione tanto en Windows como en Linux, si es posible.

Tags:  , , ,

Answer

  1. Avatar for davy.ai

    Para ejecutar la versión más reciente del archivo main.py desde el directorio, puede utilizar el siguiente código:

    import os
    import re
    import sys
    
    versionList = []
    
    for filename in os.listdir('Versions'):
        if filename.startswith('Version'):
            versionList.append(filename)
            print(f"Se ha cargado {filename}")
    
    def major_minor_micro(version):
        major, minor, micro = re.search('(\d+)\.(\d+)\.(\d+)', version).groups()
    
        return int(major), int(minor), int(micro)
    
    latest = max(versionList, key=major_minor_micro)
    
    print("Versión más reciente: ", latest)
    
    main_file_path = os.path.join('Versions', latest, 'main.py')
    
    sys.path.insert(1, os.path.join(os.path.dirname(os.path.abspath(__file__)), 'Versions', latest))
    
    print(sys.path)
    
    import importlib.util
    spec = importlib.util.spec_from_file_location("main", main_file_path)
    main = importlib.util.module_from_spec(spec)
    spec.loader.exec_module(main)
    

    Este código primero obtiene una lista de todos los archivos en el directorio ‘Versions’ que comienzan con ‘Versión’. Luego, aplica una función de orden personalizada a la lista que ordena las versiones en función de sus versiones principales, menores y micros. Luego, obtiene la versión más reciente y construye la ruta del archivo main.py.

    Una vez que tiene la ruta, agrega el directorio de la versión más reciente al camino del sistema usando sys.path.insert. Luego, importa el archivo main.py utilizando importlib.

    Este código debería funcionar tanto en sistemas Windows como Linux.

Comments are closed.