2010-02-02 6 views
1

Je voudrais savoir pourquoiRendre un module global?

>>> def func2(): 
...  global time 
...  import time 
... 
>>> time 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
NameError: name 'time' is not defined 
>>> func2() 
>>> time 
<module 'time' (built-in)> 
>>> 

œuvres, mais

>>> def func(): 
...  global module 
...  module="time" 
...  exec ("global %s" %module) 
...  exec ("import %s" %module) 
... 
>>> time 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
NameError: name 'time' is not defined 
>>> func() 
>>> time 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
NameError: name 'time' is not defined 

fonctionne pas, et comment je pourrais l'obtenir pour travailler =) merci

Répondre

7

Chacun de vos exec() appels se passe dans un espace de noms distinct. Abandonnez ce chemin. cela ne mènera qu'à la ruine.

+0

ok merci =) exec (;% (module, le module "global% d'importation%")) fonctionne – Skince

1

Parce que exec utilise sa propre portée par défaut. Si vous faites exec "global {0}; import {0}".format(module) in globals(), alors ça va marcher.

Vous ne devriez pas faire cela, sauf si vous en avez vraiment besoin. Ce que vous essayez de faire est soit très sophistiqué ou très étrange.

+0

Je ne Je pense que tout le monde a vraiment besoin d'utiliser exec comme ça. –

+0

* Personne n'a besoin d'exec, c'est Python après tout. –

0

Voici comment cela fonctionne:

exec ("import %s" % module) in globals() 

S'il vous plaît décrire le plus gros problème que vous essayez de résoudre

+0

J'essaye d'importer un module que l'utilisateur spécifie. Y a-t-il un autre moyen? – Skince

+0

@Skince, oui il y a un meilleur moyen, voir ma réponse –

1

Pour importer un module donné le nom comme une chaîne utiliser

time=__import__('time') 

Voici une façon que vous pourriez utiliser

usermodulenames = ["foo","bar","baz"] 
usermodules = dict((k,__import__(k)) for k in usermodulenames) 
+0

Comment est-ce que j'appellerais les fonctions du temps, quand ce n'est pas sûr qu'il est "temps"? Ce serait une entrée de l'utilisateur. – Skince

+0

@Skince, vous pouvez l'appeler comme vous voulez. Permettez-moi d'ajouter à ma réponse –