Existe-t-il un moyen de masquer sélectivement une cellule d'entrée ou de sortie spécifique dans le bloc-notes IPython?
Je n'ai pu trouver que le code ci-dessous pour afficher/masquer toutes les cellules d'entrée.
http://blog.nextgenetics.net/?e=102
Mais que se passe-t-il si je souhaite uniquement masquer la première cellule d'entrée d'un ordinateur portable?
Ceci est maintenant intégré à nbconvert ( à partir de 5.3. ) à l'aide de balises.
Voici un exemple de suppression d'une cellule spécifique de la sortie. Utilisation de ce carnet . L'exemple comporte trois cellules: une cellule de démarque, une cellule de code qui sera masquée et une cellule de code qui ne sera pas masquée.
remove_cell
balise à toutes les cellules que vous souhaitez masquer à l'aide de l'éditeur de balises intégré au bloc-notes ou à JupyterLab (le nom spécifique "remove_cell" n'a pas d'importance)Convertir avec nbconvert
jupyter nbconvert nbconvert-example.ipynb --TagRemovePreprocessor.remove_cell_tags='{"remove_cell"}'
Toutes les cellules avec la balise remove_cell
sera supprimé de la sortie.
En plus de cellules entières, vous pouvez filtrer uniquement les entrées ou uniquement les sorties:
TagRemovePreprocessor.remove_input_tags
TagRemovePreprocessor.remove_single_output_tags
TagRemovePreprocessor.remove_all_outputs_tags
Il s'agit d'une extension de la réponse de Mathmagician, qui vous permet de:
Ce que vous devez faire est d'exécuter d'abord le code suivant pour définir le hide_toggle
une fonction:
from IPython.display import HTML
import random
def hide_toggle(for_next=False):
this_cell = """$('div.cell.code_cell.rendered.selected')"""
next_cell = this_cell + '.next()'
toggle_text = 'Toggle show/hide' # text shown on toggle link
target_cell = this_cell # target cell to control with toggle
js_hide_current = '' # bit of JS to permanently hide code in current cell (only when toggling next cell)
if for_next:
target_cell = next_cell
toggle_text += ' next cell'
js_hide_current = this_cell + '.find("div.input").hide();'
js_f_name = 'code_toggle_{}'.format(str(random.randint(1,2**64)))
html = """
<script>
function {f_name}() {{
{cell_selector}.find('div.input').toggle();
}}
{js_hide_current}
</script>
<a href="javascript:{f_name}()">{toggle_text}</a>
""".format(
f_name=js_f_name,
cell_selector=target_cell,
js_hide_current=js_hide_current,
toggle_text=toggle_text
)
return HTML(html)
Et puis utilisez-le dans des cellules comme celle-ci:
x = 1
y = 2
print('Result is {} + {}'.format(x, y))
hide_toggle()
Ou ceci (si vous voulez basculer la cellule suivante)
hide_toggle(for_next=True)
Voici une méthode qui vous permet de masquer les cellules de la sortie HTML/PDF en modifiant uniquement les métadonnées de cellule.
Versions que j'utilise:
$ jupyter notebook --version
4.1.0
$ jupyter nbconvert --version
4.2.0
jupyter notebook
localhost:8888/nbextensions
(ou sur le port sur lequel vous avez démarré) et activez Printview
localhost:8888/tree
, créez un nouveau cahier et allez-yprint("You can see me") #but not me
View
> Cell Toolbar
> Edit Metadata
Edit Metadata
maintenant affiché en haut à droite de la cellule'hide_input':True
au json, par exemple le mien ressemblait à { "collapsed": false, "hide_input": true, "trusted": true }
aprèsjupyter nbconvert --to pdf --template printviewlatex.tplx notebookname.ipynb
(si votre ordinateur portable s'appelle notebookname.ipynb.ipynb
)Vous devriez maintenant avoir un document appelé notebookname.pdf dans le répertoire. Espérons qu'il contienne juste le texte You can see me
... les doigts croisés.
Votre solution pour masquer toutes les cellules d'entrée peut être modifiée pour n'affecter qu'une seule cellule.
Changement 'div.input'
à 'div.cell.code_cell.rendered.selected div.input'
.
HTML('''<script>
code_show=true;
function code_toggle() {
if (code_show){
$('div.cell.code_cell.rendered.selected div.input').hide();
} else {
$('div.cell.code_cell.rendered.selected div.input').show();
}
code_show = !code_show
}
$( document ).ready(code_toggle);
</script>
To show/hide this cell's raw code input, click <a href="javascript:code_toggle()">here</a>.''')
Cela fonctionne parce que lorsque vous cliquez sur le " cliquez ici " Invite sur la sortie d'une cellule, cette cellule devient la cellule "sélectionnée" et devient ainsi masquée.
Si votre code JavaScript exécute une bascule dans le <script></script>
balises avec une ligne de code comme celle-ci
$( document ).ready(code_toggle);
alors le bloc sera automatiquement ("par défaut") caché lors de l'exécution de la cellule d'entrée.
Gardez à l'esprit que si vous ne masquez pas les entrées de cellule par défaut, vous devez exécuter la cellule avec Exécuter les cellules (Ctrl+Return), not the Run Cells and Select/Insert Below options. Ceux-ci inciteront le déplacement de l'étiquette "sélectionnée" vers la cellule suivante avant d'exécuter le JavaScript, vous pouvez donc finir par masquer une cellule qui n'a pas le " cliquez ici "bascule le lien dans sa sortie. Dans ce cas, vous devrez inspecter la cellule et parcourir les balises pertinentes et modifier display='none';
à display='block';
.
Notez que cela doit être placé à la fin de tout code dans votre cellule et que vous devez avoir importé du HTML depuis IPython.display avant d'exécuter ce code. Vous pouvez le faire en exécutant
from IPython.display import HTML
Si quelqu'un trouve que l'exclusion de toutes les cellules de code est utile (ce qui n'est pas demandé ici), vous pouvez ajouter ce drapeau nbconvert --TemplateExporter.exclude_code_cell=True
D'accord, après avoir essayé sans succès, les réponses ici énoncées. J'ai trouvé cette extension de kirbs . Hide_code nbextension Cela fonctionne très bien. Mais il est recommandé de procéder comme suit:
Tout d'abord, assurez-vous d'avoir mis à jour votre jupyter, le nbconverter, les extensions nbconverter et la serverextension jupyter. Si vous l'avez fait, vous pouvez effectuer les opérations suivantes dans l'invite anaconda (ouvert avec les privilèges d'administrateur):
pip install hide_code
jupyter nbextension install --py hide_code
jupyter nbextension enable --py hide_code
jupyter serverextension enable --py hide_code
Enfin, si vous utilisez la distribution anaconda pour ouvrir vos blocs-notes, assurez-vous également d'utiliser ces commandes:
jupyter nbextension install --sys-prefix --py hide_code
jupyter nbextension enable --sys-prefix --py hide_code
jupyter serverextension enable --sys-prefix --py hide_code
S'il n'y a pas d'erreur sur l'exécution de ces commandes, vous pourrez voir et utiliser les options de masquage de code dans la barre d'outils comme indiqué ici:
Terminé! Si vous utilisez le bouton pour exporter et voilá!
Bonne chance
La solution @Mathmagician est presque parfaite, mais a de nombreux effets secondaires.
Plus correct serait comme:
from IPython.core.display import display, HTML
toggle_code_str = '''
<form action="javascript:code_toggle()"><input type="submit" id="toggleButton" value="Toggle Code"></form>
'''
toggle_code_prepare_str = '''
<script>
function code_toggle() {
if ($('div.cell.code_cell.rendered.selected div.input').css('display')!='none'){
$('div.cell.code_cell.rendered.selected div.input').hide();
} else {
$('div.cell.code_cell.rendered.selected div.input').show();
}
}
</script>
'''
display(HTML(toggle_code_prepare_str + toggle_code_str))
def toggle_code():
display(HTML(toggle_code_str))
L'appel toggle_code
que ce qui peut être placé dans une cellule de code avant un autre code, donc si le code dans la cellule est exécuté lentement, il n'y aura pas d'effets secondaires. Il résout également le problème avec Exécuter les cellules et sélectionner/insérer ci-dessous
Il ajoute le bouton bascule, mais l'état initial ne peut pas être géré
Enfin trouvé qu'il est possible d'utiliser cette extension.
https://github.com/ipython-contrib/IPython-notebook-extensions/blob/master/usability/hide_input.js