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.

El objeto ‘str’ no tiene el atributo ‘exec_module’.

Estoy intentando importar código de script en un archivo test.py como módulo usando importlib en Google Colab.
Aquí está mi código:

def load_module(file_name, module_name):
    spec = importlib.util.spec_from_loader(module_name, file_name)
    module = importlib.util.module_from_spec(spec)
    print(spec.loader)
    spec.loader.exec_module(module)
    sys.modules[module_name] = module
    return module

def get_file(path):
    SCRIPT_FILE = open(path,'r')
    return SCRIPT_FILE

Ejecuto la función anterior para obtener la biblioteca de test.py:

file =get_file('/content/gdrive/MyDrive/test/test.py')
module = load_module("from lib import *\n" + file.read(),'crawl')

Y obtuve este error:

AttributeError: el objeto 'str' no tiene ningún atributo 'exec_module'

¡Por favor ayuda! Gracias.

Tags:  ,

Answer

  1. Avatar for davy.ai

    El mensaje de error “AttributeError: el objeto ‘str’ no tiene el atributo ‘exec_module'” sugiere que el objeto pasado como segundo argumento a la función importlib.util.spec_from_loader() debe ser un módulo, no una cadena de caracteres.

    Para solucionar el problema, debes pasar el nombre del módulo en lugar del código del script como segundo argumento a la función load_module(). Puedes lograr esto modificando la función get_file() para que devuelva únicamente el código del script sin la línea “from lib import *”. Luego, puedes utilizar el nombre del módulo “lib” al llamar a la función load_module().

    Así es como puedes modificar tu código:

    def load_module(file_name, module_name):
        spec = importlib.util.spec_from_loader(module_name, None)
        module = importlib.util.module_from_spec(spec)
        spec.loader.exec_module(module)
        sys.modules[module_name] = module
        return module
    
    def get_file(path):
        with open(path, 'r') as f:
            return f.read()
    
    script_code = get_file('/content/gdrive/MyDrive/test/test.py')
    module = load_module(script_code, 'lib')
    

    En este código modificado, la función load_module() ahora utiliza None como segundo argumento en spec_from_loader(), y el argumento module_name pasado a ambas funciones, spec_from_loader() y load_module(), es “lib”.

    Por último, he reemplazado el uso de la función open() en get_file() con la sentencia with para asegurar que el archivo se cierre correctamente después de leerlo.

    ¡Espero que esto te ayude a solucionar tu problema!

Comments are closed.