web-dev-qa-db-fra.com

Chargement automatique des modules dans IPython

Existe-t-il un moyen pour qu'IPython recharge automatiquement tout le code modifié? Avant que chaque ligne ne soit exécutée dans l'environnement de ligne de commande, ou si elle échoue lorsque cela est spécifiquement demandé. Je fais beaucoup de programmation exploratoire avec IPython et SciPy et il est très pénible de devoir recharger manuellement chaque module à chaque fois que je le modifie.

142
Thomas Parslow

Pour IPython version 3.1, 4.x et 5.x

%load_ext autoreload
%autoreload 2

Ensuite, votre module sera rechargé automatiquement par défaut. C'est le doc:

File:       ...my/python/path/lib/python2.7/site-packages/IPython/extensions/autoreload.py

Docstring:
``autoreload`` is an IPython extension that reloads modules
automatically before executing the line of code typed.

This makes for example the following workflow possible:

.. sourcecode:: ipython

   In [1]: %load_ext autoreload

   In [2]: %autoreload 2

   In [3]: from foo import some_function

   In [4]: some_function()
   Out[4]: 42

   In [5]: # open foo.py in an editor and change some_function to return 43

   In [6]: some_function()
   Out[6]: 43

The module was reloaded without reloading it explicitly, and the
object imported with ``from foo import ...`` was also updated.

Il y a une astuce: quand vous oubliez tout de ce qui précède lorsque vous utilisez ipython, essayez simplement:

import autoreload
?autoreload
# Then you get all the above
220
Andrew_1510

Comme mentionné ci-dessus, vous avez besoin de l'extension autoreload. Si vous voulez qu'il démarre automatiquement chaque fois que vous lancez ipython, vous devez l'ajouter au fichier ipython_config.py fichier de démarrage:

Il peut être nécessaire d’en générer un d’abord:

ipython profile create

Ensuite, incluez ces lignes dans ~/.ipython/profile_default/ipython_config.py:

c.InteractiveShellApp.exec_lines = []
c.InteractiveShellApp.exec_lines.append('%load_ext autoreload')
c.InteractiveShellApp.exec_lines.append('%autoreload 2')

En plus d’un avertissement facultatif au cas où vous auriez besoin de tirer parti du code compilé Python du code dans .pyc des dossiers:

c.InteractiveShellApp.exec_lines.append('print "Warning: disable autoreload in ipython_config.py to improve performance." ')

edit: ce qui précède fonctionne avec les versions 0.12.1 et 0.13

86
kara deniz

RÉVISÉ - veuillez consulter Andrew_1510 réponse ci-dessous, car IPython a été mis à jour.

...

Il était un peu difficile de comprendre comment y arriver à partir d'un rapport de bogue poussiéreux, mais:

Il est livré avec IPython maintenant!

import ipy_autoreload
%autoreload 2
%aimport your_mod

# %autoreload? for help

... puis à chaque fois que vous appelez your_mod.dwim(), la dernière version sera reprise.

65
Mike McCabe

si vous ajoutez ipython_config.py dans le répertoire ~/.ipython/profile_default avec les lignes ci-dessous, la fonctionnalité de chargement automatique sera chargée au démarrage de ipython (testé sur la version 2.0.0):

print "--------->>>>>>>> ENABLE AUTORELOAD <<<<<<<<<------------"

c = get_config()
c.InteractiveShellApp.exec_lines = []
c.InteractiveShellApp.exec_lines.append('%load_ext autoreload')
c.InteractiveShellApp.exec_lines.append('%autoreload 2')
9
lowtech

Vous pouvez utiliser:

  import ipy_autoreload
  %autoreload 2 
  %aimport your_mod
2
dongweiming

Il y a une extension pour ça, mais je n'ai pas encore d'expérience d'utilisation:

http://ipython.scipy.org/ipython/ipython/attachment/ticket/154/ipy_autoreload.py

1
miku