web-dev-qa-db-fra.com

Comment (par intermittence) ignorer certaines cellules lors de l'exécution du bloc-notes IPython?

Je dois généralement réexécuter (la plupart des parties de) un ordinateur portable lors de sa réouverture, afin d'avoir accès aux variables précédemment définies et de continuer à travailler.

Cependant, parfois, j'aimerais ignorer certaines cellules, qui n'ont aucune influence sur les cellules suivantes (par exemple, elles peuvent comprendre une branche d'analyse terminée) et peuvent prendre très longtemps à s'exécuter. Ces cellules peuvent être dispersées dans le bloc-notes, de sorte que quelque chose comme "Run All Below" ne vous sera d'aucune utilité.

Existe-t-il un moyen d'y parvenir?

Idéalement, ces cellules pourraient être étiquetées avec des drapeaux spéciaux, afin qu'elles puissent être "Exécuter" manuellement, mais seraient ignorées lors de "Tout exécuter".

MODIFIER

%%cache (Extension ipycache) comme suggéré par @Jakob résout le problème dans une certaine mesure.

En fait, je n'ai même pas besoin de charger de variables (qui peuvent être grandes mais inutiles pour les cellules suivantes) lors de la réexécution, seule la sortie stockée compte pour l'analyse des résultats.

Pour contourner le problème, placez %%cache folder/unique_identifier Au début de la cellule. Le code ne sera exécuté qu'une seule fois et aucune variable ne sera chargée lors de sa réexécution, sauf si vous supprimez le fichier unique_identifier.

Malheureusement, tous les résultats de sortie sont perdus lors d'une nouvelle exécution avec %%cache ...

EDIT II (14 octobre 2013)

La version principale d'ipython + ipycache décapage maintenant (et réaffiche) également la sortie de la cellule de codage.

Pour les sorties d'affichage riches, y compris Latex, HTML (sortie pandas DataFrame), n'oubliez pas d'utiliser la méthode display () d'IPython, par exemple, display(Latex(r'$\alpha_1$'))

37
herrlich10

Actuellement, aucune fonctionnalité de ce type n'est incluse dans le bloc-notes IPython. Néanmoins, il existe quelques possibilités pour vous faciliter la vie, comme:

  • utilisez le %store ou peut-être mieux le %%cache magic (extension) pour stocker les résultats de ces cellules par intermittence, afin qu'elles n'aient pas à être recalculées (voir https://github.com/rossant/ipycache )

  • ajouter un if==0: avant les cellules que vous ne voulez pas exécuter

  • convertir ces cellules en cellules brutes (mais vous perdrez la sortie déjà stockée!)

(voir la discussion sur https://github.com/ipython/ipython/issues/2125 )

Jakob

32
Jakob

Bien que ce ne soit pas exactement ce que vous cherchez, si vous souhaitez omettre complètement l'exécution d'une cellule (où aucun résultat mis en cache n'est chargé), vous pouvez ajouter le hack suivant au début d'une cellule (en supposant que vous soyez utilisant un système d'exploitation basé sur Unix):

%%script false 

ou une variante (fonctionnant au début de 2020 - voir ici pour l'explication):

%%script false --no-raise-error
37
Mark

Si aucun résultat en cache ne doit être chargé, je trouve la Freeze nbextension très utile à cette fin.

enter image description here

Bien que non officiel, je recommande fortement d'essayer ces extensions de bloc-notes si vous ne les avez jamais utilisées auparavant.

Pour installer la machinerie d'extension,

$ pip install jupyter_contrib_nbextensions && jupyter contrib nbextension install

Pour activer l'extension Freeze, lancez jupyter notebook et ouvrez un nouveau carnet, dans le menu, sélectionnez Edit> nbextensions config, puis cochez Freeze.

0
herrlich10

Le %%script false la solution a cessé de fonctionner en 2019.

Voici quelques autres solutions de contournement disponibles. Celles-ci sont basées sur des programmes ignorant leurs arguments lorsque vous leur dites de ne pas en attendre. Voici quelques exemples simples:

Perl:

%%Perl -e0
​
for i in range(10): print(i)

Ici vous courez: Perl -e '0' cellcontents

Une version plus mémorable:

%%Perl -eat
​
for i in range(10): print(i)

Ici vous courez: Perl -e 'at' cellcontents

Frapper:

%%bash -c :

for i in range(10): print(i)

':' est un noop en bash, donc vous exécutez: bash -c : cellcontents

Je n'ai pas regardé le code d'implémentation magique externe, mais je suis sûr que les "contenus cellulaires" sont passés en arguments et ne seront pas interprétés par Shell par erreur, dites si vous deviez inclure ";" en eux et injecter accidentellement un mauvais code. Mais je ne peux pas vous le garantir.

Je suis sûr que vous pouvez trouver d'autres solutions créatives en consultant les programmes pris en charge ici: https://ipython.readthedocs.io/en/stable/interactive/magics.html#cell-magics =

0
stason