J'ai un script qui calcule des trucs. Il utilise les entrées d'un fichier séparé «inputs.py».

Dans 'inputs.py' ne sont que quelques variables:

A = 2.3
B = 4.5
C = 3.0

Dans le fichier principal, je les importe avec

from inputs import *

Si je change maintenant quelque chose dans 'inputs.py' et que j'exécute à nouveau le script, il utilise toujours les anciennes valeurs au lieu des nouvelles. Comment puis-je recharger le fichier?

reload(inputs)

Ne marche pas.

Merci d'avance!

15
Sebastian 14 juil. 2015 à 18:07

3 réponses

Meilleure réponse

Si vous utilisez Python 3.x, pour recharger les noms qui ont été importés à l'aide de from module import name, vous devrez faire -

import importlib
import inputs #import the module here, so that it can be reloaded.
importlib.reload(inputs)
from inputs import A # or whatever name you want.

Pour Python 2.x, vous pouvez simplement faire -

import inputs   #import the module here, so that it can be reloaded.
reload(inputs)
from inputs import A # or whatever name you want.
15
Anand S Kumar 14 juil. 2015 à 15:14
from inputs import *

Fait quelque chose comme ce pseudo code:

import inputs as temporary
for all names in temporary:
    (name) = temporary.name
del temporary

Le module inputs est mis en cache dans sys.modules.

Si vous effectuez un reload(inputs), le module mis en cache est rechargé, mais le processus d'affectation qui charge les données du module importé dans l'espace de noms local n'est pas répété. Vous devez le faire à la main, comme l'indique déjà l'autre réponse.

1
glglgl 14 juil. 2015 à 15:17

Citons les documents:

recharger (module)

Rechargez un module précédemment importé. L'argument doit être un objet module, il doit donc avoir été importé avec succès auparavant. Ceci est utile si vous avez édité le fichier source du module à l'aide d'un éditeur externe et que vous souhaitez essayer la nouvelle version sans quitter l'interpréteur Python. La valeur de retour est l'objet module (le même que l'argument module).

L'argument doit être un objet module, il doit donc avoir été importé avec succès auparavant. Lorsque vous faites from inputs import *, vous n'avez en fait aucun objet module dans votre espace de noms. Uniquement les membres du module.

Lorsque le rechargement (module) est exécuté:

  • Le code des modules Python est recompilé et le code au niveau du module est réexécuté, définissant un nouvel ensemble d'objets qui sont liés aux noms dans le dictionnaire du module. La fonction init des modules d'extension n'est pas appelé une deuxième fois.
  • Comme avec tous les autres objets en Python, les anciens objets ne sont récupérés qu'après que leur nombre de références soit tombé à zéro.
  • Les noms dans l'espace de noms du module sont mis à jour pour pointer vers tout objet nouveau ou modifié.
  • Les autres références aux anciens objets (comme les noms externes au module) ne sont pas rebondies pour faire référence aux nouveaux objets et doivent être mis à jour dans chaque espace de noms où ils se produisent si cela est souhaité.

Les autres références aux anciens objets (comme les noms externes au module) ne sont pas rebondies pour faire référence aux nouveaux objets et doivent être mises à jour dans chaque espace de noms où elles se produisent si vous le souhaitez. Vous avez importé des étoiles A, B et C sont précisément d'autres références.

Pour résumer, un exemple de code serait:

import os  # see below

# fake module before changes
with open('inputs.py', 'w') as f:
    f.write("a, b, c = 1, 2, 3")

import inputs

# check if all members are correct
assert inputs.a == 1
assert inputs.b == 2
assert inputs.c == 3

os.unlink('inputs.pyc')  # Remove previously compiled byte-code.
# I'm now sure if it's mandatory, anyway for some reason Python
# does not recompile inputs.py in my experiments. 

# New fake file
with open('inputs.py', 'w') as f:
    f.write("a, b, c = 4, 5, 6")

reload(inputs)

# check if members has changes
assert inputs.a == 4
assert inputs.b == 5
assert inputs.c == 6
6
Łukasz Rogalski 14 juil. 2015 à 15:31