2 votes

Comment importer un module en Python 3 à partir d'une chaîne de caractères ?

A solución pour ce problème est disponible pour Python 2, mais elle utilise la fonction imp qui est déprécié dans Python 3.

imp a été remplacé par importlib qui fonctionne bien pour les importations basées sur des fichiers. Plus précisément, importlib.import_module requiert un nom de fichier - pas une chaîne de caractères ou un gestionnaire de fichiers.

J'ai trouvé un moyen de contourner le problème en transférant le contenu de l'URL dans un fichier et en l'important.

def initlog():
    modulename = '_mylogging'
    try:
        import _mylogging
    except ImportError:
        r = requests.get('http://(...)/mylogging.py')
        with open(modulename+'.py', "w") as f:
            f.write(r.text)
    finally:
        import _mylogging

    return _mylogging.MYLogging().getlogger()

mais je voudrais éviter le fichier intermédiaire.

En mettant de côté les questions de sécurité, de performance du réseau et de disponibilité - existe-t-il un moyen d'envoyer une chaîne de caractères à importlib ? (ou à partir d'un gestionnaire de fichiers, auquel cas j'utiliserais io.StringIO )

2voto

jonrsharpe Points 34770

Vous pouvez vous adapter exactement la même réponse à 3.x, en utilisant le remplacement de imp.new_module :

from types import ModuleType

foo = ModuleType('foo')

y le remplacement du exec déclaration :

foo_code = """
class Foo:
    pass
"""

exec(foo_code, globals(), foo.__dict__)

Après quoi tout fonctionne comme prévu :

>>> dir(foo)
['Foo', '__doc__', '__loader__', '__name__', '__package__', '__spec__']
>>> foo.Foo()
<__main__.Foo object at 0x110546ba8>

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X