Rechargement de sous-modules en IPython

actuellement je travaille sur un projet python qui contient des sous-modules et utilise numpy/scipy. Ipython est utilisé comme console interactive. Malheureusement, je ne suis pas très satisfait du flux de travail que j'utilise en ce moment, j'apprécierais quelques conseils.

dans IPython, le cadre est chargé par une simple commande import . Cependant, il est souvent nécessaire de modifier le code dans l'un des submodules du cadre. A ce point un modèle est déjà chargé et J'utilise IPython pour interagir avec elle.

maintenant, le framework contient de nombreux modules qui dépendent les uns des autres, c'est-à-dire que lorsque le framework est chargé initialement, le module principal importe et configure les sous-modules. Les modifications au code ne sont exécutées que si le module est rechargé en utilisant reload(main_mod.sub_mod) . C'est compliqué car j'ai besoin de recharger tous les modules modifiés individuellement en utilisant le chemin complet. Il serait très pratique si reload(main_module) pouvait également recharger tous les sous-modules, mais sans rechargement num PY / scipy..

281
demandé sur Aaron Hall 2011-03-19 21:39:10

9 réponses

IPython est livré avec certains rechargement automatique magie:

%load_ext autoreload
%autoreload 2

il rechargera tous les modules changés à chaque fois avant d'exécuter une nouvelle ligne. La façon dont cela fonctionne est légèrement différente de dreload . Quelques mises en garde s'appliquent, tapez %autoreload? pour voir ce qui peut aller mal.


si vous souhaitez toujours activer ces paramètres, modifiez votre fichier de configuration IPython ~/.ipython/profile_default/ipython_config.py [1] et annexe:

c.InteractiveShellApp.extensions = ['autoreload']     
c.InteractiveShellApp.exec_lines = ['%autoreload 2']

crédit à @Kos via un commentaire ci-dessous.

[1] Si vous n'avez pas le fichier ~/.ipython/profile_default/ipython_config.py , vous devez d'abord appeler ipython profile create . Ou le fichier peut être localisé à $IPYTHONDIR .

397
répondu pv. 2018-01-25 16:02:04

en IPython 0.12 (et peut-être plus tôt), vous pouvez utiliser ceci:

%load_ext autoreload
%autoreload 2

il s'agit essentiellement de la même réponse que celle donnée par pv. , sauf que l'extension a été renommée et est maintenant chargée en utilisant %load_ext .

23
répondu RafG 2017-05-23 10:31:12

IPython offre dreload() récursive de recharger tous les submodules. Personnellement, je préfère utiliser la commande magique %run() (bien qu'elle n'effectue pas de recharge profonde, comme L'a souligné John Salvatier dans les commentaires).

18
répondu Sven Marnach 2011-03-21 12:28:40

pour une raison quelconque, ni %autoreload , ni dreload semblent fonctionner pour la situation où vous importer le code d'un carnet à un autre . Seulement Python simple reload fonctionne:

reload(module)

basé sur [1] .

13
répondu Dennis Golomazov 2017-05-23 11:54:46

Que pensez-vous de ceci:

import inspect

# needs to be primed with an empty set for loaded
def recursively_reload_all_submodules(module, loaded=None):
    for name in dir(module):
        member = getattr(module, name)
        if inspect.ismodule(member) and member not in loaded:
            recursively_reload_all_submodules(member, loaded)
    loaded.add(module)
    reload(module)

import mymodule
recursively_reload_all_submodules(mymodule, set())

cela devrait efficacement recharger l'arbre entier des modules et des sous-modules que vous lui donnez. Vous pouvez également mettre cette fonction dans votre .ipythonrc (je pense) donc il est chargé chaque fois que vous démarrez l'interpréteur.

3
répondu Y.H Wong 2011-03-19 22:27:03

http://shawnleezx.github.io/blog/2015/08/03/some-notes-on-ipython-startup-script /

pour éviter de taper ces fonctions magiques encore et encore, ils pourraient être mis dans le script de démarrage ipython(nommez-le avec .le suffixe py sous .ipython/profil_default / startup. Tous les scripts python sous ce dossier seront chargés selon l'ordre lexical), qui ressemble à ce qui suit:

from IPython import get_ipython
ipython = get_ipython()

ipython.magic("pylab")
ipython.magic("load_ext autoreload")
ipython.magic("autoreload 2")
2
répondu Pegasus 2018-06-06 11:48:00

une autre option:

$ cat << EOF > ~/.ipython/profile_default/startup/50-autoreload.ipy
%load_ext autoreload
%autoreload 2
EOF

vérifié sur ipython et ipython3 v5.1.0 sur Ubuntu 14.04.

1
répondu Chad 2016-11-23 05:04:56

exécuter un script dans IPython3 n'a pas rechargé les modules en utilisant le %autoreload magic whatever.

%run my_script.py

# Make changes to `my_module` imported inside `my_script.py`

%load_ext autoreload
%autoreload 2

%run my_script.py

# changes not loaded

ce qui suit a fonctionné pour moi:

%run my_script.py

# Make changes to `my_module` imported inside `my_script.py`

from IPython.lib.deepreload import reload
reload(my_module_name)

%run my_script.py

# changes correctly loaded
0
répondu ryanjdillon 2016-11-24 12:42:10

Sur Jupyter Cahiers de notes sur Anaconda, pour ce faire:

%load_ext autoreload
%autoreload 2

produit le message:

l'extension autoreload est déjà chargée. Pour le recharger, utiliser: %reload_ext autoreload

on dirait qu'il est préférable de faire:

%reload_ext autoreload
%autoreload 2

information de Version:

la version du serveur notebook est 5.0.0 et tourne sur: Python 3.6.2 / Anaconda, Inc./ (par défaut, Sep 20 2017, 13:35:58) [MSC v. 1900 32 bit (Intel)]

0
répondu thanks_in_advance 2017-10-26 22:35:02