Comment importer un module donné son nom?

Je suis en train d'écrire une application Python qui prend comme une commande comme argument, par exemple:

$ python myapp.py command1

Je veux la demande pour être extensible, qui est, pour être en mesure d'ajouter de nouveaux modules qui implémentent de nouvelles commandes sans avoir à changer la source principale de l'application. L'arbre ressemble à quelque chose comme:

myapp/
    __init__.py
    commands/
        __init__.py
        command1.py
        command2.py
    foo.py
    bar.py

Je veux donc l'application pour trouver la disposition des modules de commande lors de l'exécution et exécutez-la.

Python définit un __import__ fonction qui prend une chaîne de caractères pour un nom de module:

__import__(nom, globals=None, les habitants=None, fromlist=(), niveau=0)

Les importations de fonction le nom du module, éventuellement en utilisant le compte tenu de variables globales et locales afin de déterminer comment interpréter le nom dans un package contexte. Le fromlist donne les noms des objets ou des submodules qui doivent être importées à partir du module donné par son nom.

Source: https://docs.python.org/3/library/functions.html#import

Donc actuellement, j'ai quelque chose comme:

command = sys.argv[1]
try:
    command_module = __import__("myapp.commands.%s" % command, fromlist=["myapp.commands"])
except ImportError:
    # Display error message

command_module.run()

Cela fonctionne bien, je me demandais simplement si il est peut-être un plus idiomatiques façon d'accomplir ce que nous faisons avec ce code.

Remarque que j'ai spécifiquement ne voulez pas d'obtenir à l'aide des œufs ou des points d'extension. Ce n'est pas un projet open-source et je n'ai pas s'attendre à être "plugins". Le point est de simplifier le code de l'application principale et de supprimer la nécessité de le modifier à chaque fois qu'un nouveau module de commande est ajouté.

InformationsquelleAutor Kamil Kisiel | 2008-11-19