2010-09-01 4 views
15

En python, vous pouvez faire quelque chose comme ceci pour importer un module en utilisant un nom de fichier de chaîne, et assigner son espace de noms à une variable sur l'espace de noms local.Python, importer une chaîne de code Python en tant que module

x = __import__(str) 

Je me demande s'il y a une fonction connexe qui prendra une chaîne de caractères de code Python, au lieu d'un chemin vers un fichier avec le code Python, et retourne son espace de noms comme une variable.

Par exemple,

str = "a = 5"; 
x = importstr(str) 
print x.a 
#output is 5 

Je me rends compte que je pouvais écrire la chaîne dans un fichier, puis utilisez __import__ là-dessus, mais je voudrais sauter le fichier intermédiaire si possible.

La raison en est que j'expérimente avec la métaprogrammation en python, et cela semble être une bonne solution à ce que je fais.

Répondre

13

Voici un example de créer dynamiquement des objets du module en utilisant le imp module

+1

Oui, juste du bon côté. –

+0

hrm ... eu ma première downvote avec cette réponse et je ne sais pas pourquoi? –

+0

@JeremyBrown juste la chose que je cherchais. Comme je l'ai voté, considérer le vote vers le bas défait;) –

2

Est-ce quelque chose que vous cherchez?

my_namespace = {} 
exec "a = 5" in my_namespace 
print my_namespace["a"] 
+0

je préfère ne pas avoir besoin de se référer aux éléments d'espace de noms en utilisant une chaîne – Mike

5

Voici comment importer une chaîne en tant que module:

import sys,imp 

my_code = 'a = 5' 
mymodule = imp.new_module('mymodule') 
exec my_code in mymodule.__dict__  

afin que vous puissiez désormais accéder aux attributs du module (et fonctions, classes, etc.) en tant que:

mymodule.a 
>>> 5 

Pour toute prochaine tentative ignorer d'importer, d'ajouter le module à sys:

sys.modules['mymodule'] = mymodule 
3

Malheureusement, le module imp a récemment été dépréciée (je ne sais pas pourquoi).

Au lieu de cela, vous devriez faire ceci:

from types import ModuleType 
import sys 

mod = ModuleType('my_module', 'doc string here') 
exec('a = 1', mod.__dict__) 
print(mod.a) # prints 1 
# add to sys.modules 
sys.modules['my_module'] = mod 

Ou vous pouvez utiliser RuntimeModule.from_string de PyExt:

from pyext import RuntimeModule 

mod = RuntimeModule.from_string('a = 1') 
print(mod.a) # 1 
Questions connexes