Importar archivo usando cadena como nombre

Posible duplicado:
Importación dinámica de módulos en Python

Tengo la intención de hacer un conjunto de archivos en algún momento pronto, y la mejor manera de organizarlo es tener una lista, esa lista estará en la parte superior de un archivo, y luego vendrá una cantidad ridícula de código para manejar Lo que controla esa lista y cómo funciona. Estoy buscando escribir dicha lista solo una vez, y dicha lista es una lista de carpetas y nombres de archivos en este formato:

[(folder/filename, bool, bool, int), (folder/filename, bool, bool, int)] 

Como puede ver, la folder/filename son los mismos (más o menos). El nombre del archivo es el nombre de la carpeta con .py al final, pero al importar XXX no es necesario importar XXX.py, por lo que no veo que esto cause un problema.

El problema que estoy enfrentando es importar usando este método …

 for (testName, auto, hardware, bit) in testList: print(testName) paths = "\\" + testName print paths addpath(paths) sys.modules[testName] = testName # One of a few options I've seen suggested on the net print("Path Added") test = testName + ".Helloworld()" eval(test) 

Entonces, para cada prueba que tengo, imprima el nombre, ensamble una cadena que contenga la ruta ( "\\testName" ), para este ejemplo, imprima la ruta de la prueba, luego agregue la ruta a la lista ( sys.path.append(path) ), luego imprima para confirmar que sucedió, luego arme una cadena que será ejecutada por eval para el módulo principal de pruebas y finalmente la evalúe.

Como puede ver, actualmente tengo que tener una lista de importaciones en la parte superior. No puedo simplemente importar testName (el contenido de testName es el nombre del módulo que deseo importar), ya que intentará encontrar un módulo llamado testName , no un módulo llamado el contenido de testName .

He visto algunos ejemplos de dónde se ha hecho esto, pero no puedo encontrar ninguno que funcione en mis circunstancias. Si alguien pudiera tirar literalmente un trozo de código que lo hace sería maravilloso.

También solicitaría que no me cuelguen, dibujen ni separen para usar eval, ya que se usa en un entorno muy controlado (la lista a través de la cual se encuentra dentro del archivo .py, por lo que ningún “usuario final” debería meterse con eso).

No estoy seguro si entendí todo correctamente, pero puedes importar un módulo dinámicamente usando __import__ :

 mod = __import__(testName) mod.HelloWorld() 

Edición : no estaba al tanto de que el uso de __import__ fue desalentado por los documentos de python para el código de usuario: __import__ documentación (como lo señaló Bakuriu)

Esto también debería funcionar y sería considerado mejor estilo:

 import importlib mod = importlib.import_module(testName) mod.HelloWorld() 
  1. Nunca, nunca, nunca te metas con sys.modules directamente si no sabes exactamente lo que estás haciendo.
  2. Hay muchas maneras de hacer lo que quieres:
    1. La función __import__ incorporada
    2. Usando imp.load_module
    3. Usando importlib.import_module

__import__ usar __import__ directamente, y buscar importlib.import_module (que también se sugiere al final de la documentación de __import__ ).

Agregue la ruta donde reside el módulo a sys.path. Importe el módulo utilizando la función __import__ que acepta una variable de cadena como nombre del módulo.

 import sys sys.path.insert(0, mypath) # mypath = path of module to be imported imported_module = __import__("string_module_name") # __import__ accepts string imported_module.myfunction() # All symbols in mymodule are now available normally