Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

from ... import avec __import__

1 view
Skip to first unread message

Kobayashi

unread,
Oct 1, 2009, 8:57:30 AM10/1/09
to
Bonjour � tous,

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.

Amaury Forgeot d'Arc

unread,
Oct 1, 2009, 7:03:40 PM10/1/09
to
Bonjour,

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

Bruno Desthuilliers

unread,
Oct 2, 2009, 3:53:10 AM10/2/09
to
Kobayashi a �crit :

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 !-)

Kobayashi

unread,
Oct 2, 2009, 4:48:28 AM10/2/09
to
Bruno Desthuilliers a �crit :

> Kobayashi a �crit :
>> Bonjour � tous,
>>
>> 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 !

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.


Kobayashi

unread,
Oct 2, 2009, 4:59:12 AM10/2/09
to
Amaury Forgeot d'Arc a �crit :

> Bonjour,
>
> Kobayashi a �crit :
>> Bonjour � tous,
>>
>> 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.

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,
>

Michel Claveau - MVP

unread,
Oct 2, 2009, 8:56:20 AM10/2/09
to
Salut !

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

Kobayashi

unread,
Oct 2, 2009, 10:54:03 AM10/2/09
to
Michel Claveau - MVP a écrit :
> Salut !

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.

Michel Claveau - MVP

unread,
Oct 2, 2009, 12:00:34 PM10/2/09
to
Re !

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

Kobayashi

unread,
Oct 2, 2009, 12:29:45 PM10/2/09
to
Kobayashi a �crit :

> Bruno Desthuilliers a �crit :
>> Kobayashi a �crit :
>>> Bonjour � tous,
>>>
>>> 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 !
>
> 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

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 ...

0 new messages