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 actuellement, j'apprécierais quelques conseils.
Dans IPython, le framework est chargé par une simple import
commande. Cependant, il est souvent nécessaire de changer de code dans l'un des sous-modules du framework. À ce stade, un modèle est déjà chargé et j'utilise IPython pour interagir avec lui.
Maintenant, le framework contient de nombreux modules qui dépendent les uns des autres, c'est-à-dire que lorsque le framework est initialement chargé, le module principal importe et configure les sous-modules. Les modifications du code ne sont exécutées que si le module est rechargé à l'aide de reload(main_mod.sub_mod)
. C'est lourd car j'ai besoin de recharger tous les modules modifiés individuellement en utilisant le chemin complet. Il serait très pratique de reload(main_module)
recharger également tous les sous-modules, mais sans recharger numpy / scipy ..
However, it is often necessary to change code in one of the submodules of the framework.
Alors pourquoinecessary to change code
? MerciRéponses:
IPython est livré avec une magie de rechargement automatique :
Il rechargera tous les modules modifiés à chaque fois avant d'exécuter une nouvelle ligne. La façon dont cela fonctionne est légèrement différente de
dreload
. Certaines mises en garde s'appliquent, tapez%autoreload?
pour voir ce qui peut mal se passer.Si vous souhaitez toujours activer ces paramètres, modifiez votre fichier de configuration IPython
~/.ipython/profile_default/ipython_config.py
[1] et ajoutez:Merci à @Kos via un commentaire ci-dessous.
[1] Si vous n'avez pas le fichier
~/.ipython/profile_default/ipython_config.py
, vous devez d'ipython profile create
abord appeler . Ou le fichier peut être localisé à$IPYTHONDIR
.la source
c.InteractiveShellApp.extensions = ['autoreload']
etc.InteractiveShellApp.exec_lines = ['%autoreload 2']
dans mon~/.ipython/profile_default/ipython_config.py
.Dans IPython 0.12 (et peut-être plus tôt), vous pouvez utiliser ceci:
C'est essentiellement la même chose que la réponse de pv. , sauf que l'extension a été renommée et est maintenant chargée à l'aide de
%load_ext
.la source
Pour une raison quelconque, ni
%autoreload
, ni nedreload
semble fonctionner pour la situation lorsque vous importez du code d'un ordinateur portable à un autre . Seul Pythonreload
fonctionne:Basé sur [1] .
la source
%autoreload
technique. Il y a un rapport de bogue ouvert pour ajouter un support à%autoreload
cela. .IPython propose
dreload()
de recharger récursivement tous les sous-modules. Personnellement, je préfère utiliser la%run()
commande magique (bien qu'elle n'effectue pas de rechargement profond, comme l'a souligné John Salvatier dans les commentaires).la source
dreload
a été remplacé dans IPython récent (par exemple IPython 6.0) par deepreload .Le module nommé
importlib
permet d'accéder aux importations internes. Surtout, il fournit une fonctionimportlib.reload()
:Au contraire de
%autoreload
,importlib.reload()
réinitialisez également les variables globales définies dans le module. Dans la plupart des cas, c'est ce que vous voulez.importlib
n'est disponible que depuis Python 3.1. Pour une version plus ancienne, vous devez utiliser le moduleimp
.la source
http://shawnleezx.github.io/blog/2015/08/03/some-notes-on-ipython-startup-script/
Pour éviter de taper ces fonctions magiques encore et encore, elles pourraient être placées dans le script de démarrage ipython (nommez-le avec le suffixe .py sous .ipython / profile_default / startup. Tous les scripts python sous ce dossier seront chargés selon l'ordre lexical), qui ressemble à ceci:
la source
%run script.py
de l'IPython REPLQue dis-tu de ça:
Cela devrait recharger efficacement l'arborescence complète des modules et sous-modules que vous lui donnez. Vous pouvez également mettre cette fonction dans votre .ipythonrc (je pense) afin qu'elle soit chargée à chaque démarrage de l'interpréteur.
la source
from ... import ...
ouimport ... as
. Au moins, cela me pose souvent des problèmes lorsque je travaille de manière interactive sur le terminal. Je suis passé à l'utilisation de macros stockées dans IPython qui effectuent les importations et les configurations nécessaires pour commencer à travailler dans un état prédéfini.from ... import ...
etimport ... as
tant que la chose que vous avez importée est un module. La seule chose qu'il ne couvre pas, ce sont les modules d'un package qui n'ont pas été chargés à partir de son__init__.py
fichier. Pour les packages, vous pouvez probablement vérifier si l'__path__
attribut du module est un répertoire. Si c'est le cas, parcourez-le et importez récursivement tous les modules que vous pourriez trouver. Je n'ai pas écrit cette partie car l'auteur n'a pas demandé de solution pour les packages.pkgutil
pour obtenir tous les sous-modules dans un package, même si le package n'importe pas les sous-modules dans le module supérieur. stackoverflow.com/a/1707786/1243926sys.modules:
Une autre option:
Vérifié sur ipython et ipython3 v5.1.0 sur Ubuntu 14.04.
la source
Ma pratique standard pour le rechargement est de combiner les deux méthodes après la première ouverture de
IPython
:Le chargement des modules avant de le faire empêchera leur rechargement, même avec un manuel
reload(module_name)
. J'ai toujours, très rarement, des problèmes inexplicables avec les méthodes de classe ne rechargeant pas que je n'ai pas encore examinées.la source
Notez que ce qui précède
autoreload
ne fonctionne dans IntelliJ que si vous enregistrez manuellement le fichier modifié (par exemple en utilisant ctrl + s ou cmd + s). Cela ne semble pas fonctionner avec la sauvegarde automatique.la source
Sur les ordinateurs portables Jupyter sur Anaconda, procédez comme suit:
produit le message:
Il semble préférable de faire:
Information sur la version:
la source
Tous les sous-objets ne seront pas rechargés par cela, je crois que vous devez utiliser la charge avancée de IPython pour cela.
la source