web-dev-qa-db-fra.com

rafraîchir/recharger python

C'est une question très basique - mais je n'ai pas trouvé de réponse en cherchant en ligne.

J'utilise python pour contrôler ArcGIS et j'ai un simple script python, qui appelle du code pré-écrit.

Cependant, lorsque je modifie le code pré-écrit, cela ne semble pas entraîner de changement. J'ai importé ce module et j'ai essayé de l'actualiser, mais rien ne se passe.

J'ai même déplacé le fichier qu'il appelle vers un autre emplacement et le script fonctionne toujours correctement. Hier, j'ai ajouté le dossier contenant tous mes fichiers Python dans le chemin d'accès système (à l'aide de sys.append ('chemin')), et je me demande si cela a fait une différence.

Merci d'avance et désolé pour la terminologie bâclée. 

27
womble

On ignore ce que vous entendez par "actualiser", mais le comportement normal de Python est que vous devez redémarrer le logiciel pour que celui-ci ait une nouvelle apparence sur un module Python et le relise.

Si vos modifications ne sont pas prises en compte, même après le redémarrage, cela est dû à l'une des deux erreurs suivantes:

  1. L'horodatage sur le fichier pyc est incorrect et quelque temps dans le futur.
  2. En fait, vous éditez le mauvais fichier.

Avec reload, vous pouvez relire un fichier même sans redémarrer le logiciel avec la commande reload (). Notez que toute variable pointant sur un élément du module devra être réimportée après le rechargement. Quelque chose comme ça:

import themodule
from themodule import AClass

reload(themodule)
from themodule import AClass
32
Lennart Regebro

J'ai utilisé ce qui suit lors de l'importation de tous les objets depuis un module pour m'assurer que web2py utilisait mon code actuel:

import buttons
import table
reload(buttons)
reload(table)
from buttons import *
from table import *
3
Aram Kocharyan

Si vous utilisez un shell IPython, certaines commandes magiques existent.

Les documents IPython couvrent cette fonctionnalité appelée l’extension autoreload .

A l'origine, j'ai trouvé cette solution dans le blog de Jonathan March sur ce sujet (voir le point 3 à partir de ce lien).

En gros, tout ce que vous avez à faire est le suivant et les modifications que vous apportez sont automatiquement répercutées après avoir enregistré:

In [1]: %load_ext autoreload

In [2]: %autoreload 2

In [3]: Import MODULE

In [4]: my_class = Module.class()
        my_class.printham()
Out[4]: ham

In [5]: #make changes to printham and save
In [6]: my_class.printham() 
Out[6]: hamlet
3
Thej Kiran

Je ne suis pas vraiment sûr que ce soit ce que vous voulez dire, alors n'hésitez pas à me corriger. Vous importez un module - appelons-le mymodule.py - dans votre programme, mais lorsque vous modifiez son contenu, vous ne voyez pas la différence?

Python ne cherchera pas de modifications dans mymodule.py à chaque utilisation, mais le chargera une première fois, le compilera en bytecode et le conservera en interne. Normalement, il enregistrera également le code secondaire compilé (mymodule.pyc). La prochaine fois que vous lancerez votre programme, il vérifiera si mymodule.py est plus récent que mymodule.pyc et le recompilera si nécessaire.

Si vous en avez besoin, vous pouvez recharger le module explicitement:

import mymodule

[... some code ...]

if userAskedForRefresh:
    reload(mymodule)

Bien sûr, c'est plus compliqué que cela et vous pouvez avoir des effets secondaires en fonction de ce que vous faites avec votre programme pour l'autre module, par exemple si les variables dépendent des classes définies dans mymodule.

Vous pouvez également utiliser la fonction execfile (ou exec(), eval(), compile()).

1
RedGlyph

J'ai eu exactement le même problème lors de la création d'un script de géotraitement pour ArcGIS 10.2. J'ai eu un script python toolbox, un script outil et ensuite un script commun. J'ai un paramètre pour Dev/Test/Prod dans l'outil qui contrôlerait quelle version du code a été exécutée. Dev exécutera le code dans le dossier dev, testera à partir du dossier test et prod à partir du dossier prod. Les modifications apportées au script de développement commun ne seraient pas exécutées lorsque l'outil était exécuté à partir d'ArcCatalog. La fermeture d’ArcCatalog n’a fait aucune différence. Même si j'ai sélectionné Dev ou Test, il sera toujours exécuté à partir du dossier prod.

L'ajout de reload (myCommonModule) au script de l'outil a résolu ce problème.

0
Allan Benvin

Les cas seront différents pour les différentes versions de python . Voici un exemple de version de python 3.4 ou supérieure:

hello import hello_world
#Calls hello_world function
hello_world()
HI !!
#Now changes are done and reload option is needed
import importlib
importlib.reload(hello)
hello_world()
How are you?

Pour les versions antérieures de Python telles que 2.x, utilisez la fonction de rechargement intégrée, comme indiqué ci-dessus . Il est préférable d'utiliser ipython3 car il fournit une fonctionnalité de chargement automatique.

0
Dhiraj Sharma