J'arrive au cas o� je veux importer des symboles
depuis le fichier aaa-bbb.py ...Evidemment :
from aaa-bbb import *
�choue. Par contre :
mod = __import__("aaa-bbb")
est ok ... Donc je cherche le moyen de faire
from ... import ...
en utilisant __import__ ?? J'ai su faire cela mais
je ne parviens pas � m'en rappeler !
Merci d'avance !
K.
Kobayashi a �crit :
il n'y a pas de commande toute faite. Mais on peut faire ceci:
mod = __import__("aaa-bbb")
globals().update(mod.__dict__)
Attention ce code importe aussi les �l�ments qui commencent par '_' (ce
que "import *" ne fait pas) y compris des trucs qui peuvent �tre
emb�tants comme __file__, __name__, __doc__...
il vaut mieux les enlever:
mod = __import__("aaa-bbb")
globals().update((name, value)
for name, value in mod.__dict__.iteritems()
if not name.startswith('_'))
Bonne nuit,
--
Amaury
T'aurais eu plus vite fait de consulter le FameuxManuel(tm):
http://docs.python.org/library/functions.html
"""
__import__(name[, globals[, locals[, fromlist[, level]]]])�
(snip)
On the other hand, the statement from spam.ham import eggs, sausage
as saus results in
_temp = __import__('spam.ham', globals(), locals(), ['eggs',
'sausage'], -1)
eggs = _temp.eggs
saus = _temp.sausage
Here, the spam.ham module is returned from __import__(). From this
object, the names to import are retrieved and assigned to their
respective names.
"""
Ceci �tant, la solution la plus simple reste bien s�r de nommer ton
module de fa�on � pouvoir l'utiliser normalement !-)
Bonjour Bruno,
>
> T'aurais eu plus vite fait de consulter le FameuxManuel(tm):
>
> http://docs.python.org/library/functions.html
Merci du conseil ! Mais quand je pose une question sur le forum,
j'ai d�j� lu le manuel ... Peut-�tre pas assez bien, je te
l'accorde puisque je n'ai pas trouv� ce que je cherchais.
>
> """
> __import__(name[, globals[, locals[, fromlist[, level]]]])�
>
> (snip)
> On the other hand, the statement from spam.ham import eggs, sausage
> as saus results in
>
> _temp = __import__('spam.ham', globals(), locals(), ['eggs',
> 'sausage'], -1)
> eggs = _temp.eggs
> saus = _temp.sausage
Tu charges les symboles 'eggs' et 'sausage' depuis le
module 'spam.ham' dans le module _temp ... Tu d�finis eggs
� _temp.eggs et saus � _temp.sausage dans ton contexte
global. Au passage, tu as modifi� le nom sausage --> saus
Cela me para�t assez diff�rent d'un
from spam.ham import eggs, saus
qui �chouerai ou d'un
from spam.ham import eggs, sausage
qui ne d�finit pas le nom 'saus'
et encore plus d'un
from spam.ham import *
que je voulais faire initialement.
>
> Here, the spam.ham module is returned from __import__(). From this
> object, the names to import are retrieved and assigned to their
> respective names.
> """
Loin de moi de critiquer la doc. python qui est extr�mement bien faite
mais la phrase "and assigned to their respective names." ne me para�t
d'une limpidit� absolue ... J'imagine qu'elle veut dire que l'on peut
acc�der � _temp.sausage mais la ligne de code "saus = _temp.sausage"
rend l'exemple confus (je trouve) ... Il aurait �t� peut-�tre
suffisant d'�crire :
print _temp.eggs
print _temp.sausage
>
> Ceci �tant, la solution la plus simple reste bien s�r de nommer ton
> module de fa�on � pouvoir l'utiliser normalement !-)
:) Evidemment, si on change de probl�me ...
Imagine que tu as une application graphique qui permet de mettre
en donn�e un code de calcul et que le format persistant de cette
application est un script python (pour l'utilisateur, c'est
formidable, il peut faire rapidement une mise en donn�e pour
aller ensuite modifier le code, faire des boucles, etc.).
Tu aimerais que ton application puisse recharger un script
python sauvegard� ... Nous sommes arriv� au cas o� un utilisateur
a eu la bonne id�e de sauvegarder son �tude dans "usecase-test.py" ...
d'o� le probl�me ! Soit on lui dit que c'est une limitation,
soit on essaye de trouver un moyen de recharger son cas.
Cordialement,
K.
Bonjour Amaury,
>
> il n'y a pas de commande toute faite. Mais on peut faire ceci:
>
> mod = __import__("aaa-bbb")
> globals().update(mod.__dict__)
>
> Attention ce code importe aussi les �l�ments qui commencent par '_' (ce
> que "import *" ne fait pas) y compris des trucs qui peuvent �tre
> emb�tants comme __file__, __name__, __doc__...
>
> il vaut mieux les enlever:
>
> mod = __import__("aaa-bbb")
> globals().update((name, value)
> for name, value in mod.__dict__.iteritems()
> if not name.startswith('_'))
Merci, c'est "presque" exactement ce que je cherchais ...
Pourquoi presque ? Parce que j'ai essay� de reproduire
le comportement de "from os import chmod" en utilisant
ton code sauf que en python 2.6.1 chez moi :
mod = __import__("os", globals(), locals(), ("chmod", ))
me ram�ne tous les symboles de os dans mod (plus pr�cis�ment
mod.__dict__ contient tout). Evidemment, je pourrais faire
le tri au moment du "update" ... mais j'ai comme l'impression
qu'il y a encore une subtilit� qui m'�chappe ...
K.
>
>
> Bonne nuit,
>
Tente
execfile("aaa-bbb.py")
ou
execfile("aaa-bbb.py",globals(),globals())
OK, je sais que certains vont crier "Au loup !" ; mais il faut savoir s donner les moyens de ses ambitions.
@+
--
Michel Claveau
Salut Michel,
>
> Tente
> execfile("aaa-bbb.py")
> ou
> execfile("aaa-bbb.py",globals(),globals())
Je ne connaissais pas cette fonctionnalité de
execfile ! En gros, cela revient à faire un
from aaa-bbb import *
mais sans "module administration" !?
On en apprend vraiment tous les jours ...
Les deux restrictions que je vois :
1. Il faut appeler execfile avec le
bon chemin si le fichier n'est
pas dans le répertoire courant.
Il faut donc connaître ce chemin ...
et cela revient à parser sys.path ou
à utiliser __import__, ou ...
2. On ne peut pas faire
from aaa-bbb import AAA
par ce biais ... ou alors tu vas encore
me ressortir une ruse du tonnerre !
>
> OK, je sais que certains vont crier "Au loup !"
Pourquoi ?
>
> ; mais il faut savoir s donner les moyens de ses ambitions.
>
> @+
Merci de ta réponse,
K.
Tu peux jongler avec le dictionnaire locals()
Exemple :
def fromexec(nomobj):
execfile("aaa-bbb.py",locals(),locals())
return locals()[nomobj]
mavar=fromexec('zzz') # revient à: from aaa-bbb import zzz as mavar
print mavar
mafonc=fromexec('f2') # autre objets (ici fonction) même combat
print mafonc(444)
Je te laisse le soin de remplacer nomobj par une liste de paramètres...
@+
--
Michel Claveau
Ooops, je n'avais pas vu le "sausage as saus" dans
cet exemple ... Mea culpa ! Le reste de ma remarque
concernant ce point n'a pas de raison d'�tre.
La doc. est claire et c'est moi qui ai mal lu !
Je me disais aussi ...