Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

from ... import avec __import__

7 réponses
Avatar
Kobayashi
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.

7 réponses

Avatar
Amaury Forgeot d'Arc
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.



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
Avatar
Bruno Desthuilliers
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 !



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 !-)
Avatar
Kobayashi
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.
Avatar
Kobayashi
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,



Avatar
Michel Claveau - MVP
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
Avatar
Kobayashi
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.
Avatar
Kobayashi
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 ...


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