¿Cómo omitir (intermitentemente) ciertas celdas cuando se ejecuta el cuaderno IPython?

7 minutos de lectura

avatar de usuario de herrlich10
herrlich10

Por lo general, tengo que volver a ejecutar (la mayor parte de) un cuaderno cuando lo vuelvo a abrir, para poder acceder a las variables previamente definidas y seguir trabajando.

Sin embargo, a veces me gustaría omitir algunas de las celdas, que no tienen influencia en las celdas posteriores (p. ej., pueden comprender una rama de análisis que está terminada) y pueden tardar mucho tiempo en ejecutarse. Estas celdas se pueden dispersar por todo el cuaderno, por lo que algo como “Ejecutar todo a continuación” no ayudará mucho.

¿Hay una manera de lograr esto?

Idealmente, esas celdas podrían etiquetarse con algunas banderas especiales, de modo que pudieran “Ejecutarse” manualmente, pero se omitirían cuando “Ejecutar todo”.

EDITAR

%%cache (extensión ipycache) como lo sugiere @Jakob resuelve el problema hasta cierto punto.

En realidad, ni siquiera necesito cargar ninguna variable (que puede ser grande pero innecesaria para las siguientes celdas) cuando se vuelve a ejecutar, solo la salida almacenada importa como resultados de análisis.

Como solución temporal, coloque %%cache folder/unique_identifier al principio de la celda. El código se ejecutará solo una vez y no se cargarán variables cuando se vuelva a ejecutar, a menos que elimine el archivo de identificador_único.

Desafortunadamentetodos los resultados de salida se pierden cuando se vuelve a ejecutar con %%cache

EDITAR II (14 de octubre de 2013)

La versión maestra de ipython+ipycache ahora también selecciona (y vuelve a mostrar) la salida de la celda de código.

Para salidas de visualización enriquecidas que incluyen Latex, HTML (salida de pandas DataFrame), recuerde usar el método display() de IPython, por ejemplo, display(Latex(r'$\alpha_1$'))

  • Si no necesita volver a mostrar la salida, puede definir su propia magia de salto como lo hice aquí: stackoverflow.com/a/43584169/4098821

    – robar

    24 de abril de 2017 a las 9:21

Avatar de usuario de Mark
Marca

Aunque esto no es exactamente lo que parece estar buscando, si desea omitir por completo la ejecución de una celda (donde no se cargan los resultados almacenados en caché), puede agregar el siguiente truco al comienzo de una celda (suponiendo que está utilizando un sistema operativo basado en Unix):

%%script false

o una variante (en funcionamiento desde principios de 2020; consulte aquí para la explicación):

%%script false --no-raise-error

  • ¿Alguien sabe cómo hacer esto en Windows?

    – Royco

    18 de febrero de 2017 a las 22:10

  • Funciona perfectamente en windows. La salida del cuaderno será “No se pudo encontrar el programa: ‘falso'”.

    – DJV

    13 de junio de 2019 a las 7:33

  • Esto dejó de funcionar en algún momento en 2019. Puede encontrar nuevas soluciones aquí.

    – estación

    19 de enero de 2020 a las 0:40


  • en su lugar, use esto ya que funciona en todas las plataformas conocidas: %% salto de eco de secuencia de comandos

    – dabru

    17 sep 2020 a las 17:09


  • Qué pasa %%script true en lugar de %%script false --no-raise-error?

    – wjandrea

    21 de noviembre de 2021 a las 19:37


Avatar de usuario de Jakob
Jakob

Actualmente, no existe tal característica incluida en el cuaderno de IPython. Sin embargo, existen algunas posibilidades para facilitarte la vida, como:

  • utilizar el %store o tal vez mejor el %%cache magia (extensión) para almacenar los resultados de estas celdas intermitentemente, para que no tengan que volver a calcularse (ver https://github.com/rossant/ipycache)

  • Agrega un if==0: antes de las celdas que no desea ejecutar

  • convierta estas celdas en celdas sin procesar (¡pero perderá la salida ya almacenada!)

(ver discusión en https://github.com/ipython/ipython/issues/2125)

  • Es bueno saber acerca de la extensión ipycache, que funciona de manera similar a lo que estoy haciendo (manualmente) ahora, ¡pero solo que mejor! El %%cache La magia sirve efectivamente como indicador especial cuando “Ejecutar todo”, y la repetición manual requiere simplemente la eliminación del archivo de caché. ¡Brillante! Gracias, Jakob~

    – herrlich10

    11/10/2013 a las 15:41

  • De hecho, usar %%cache es mucho más conveniente que manejar manualmente con %store. %store necesita enviar una por una las variables para guardar, pero puede leer todo a la vez, poco sin sentido. %%cache funciona perfectamente para toda la celda y %store funciona mejor para variables individuales.

    – m3nda

    11 de abril de 2018 a las 3:26

  • ipycache ya no se mantiene. ¿Conoce alguna otra solución?

    – Chris_Rands

    4 de febrero de 2020 a las 13:18

  • @Chris_Rands actualmente uso la extensión de congelación. Puede preguntarle directamente a Rossant.

    – Jakob

    4 de febrero de 2020 a las 20:21

avatar de usuario de dabru
dabru

Aquí hay una solución simple y universal sin necesidad de soluciones alternativas: simplemente escriba esto como la línea superior de la celda para omitir la celda:

%%script echo skipping

Está probado en Windows y Mac con Jupyter reciente, y creo que también debería funcionar en otras plataformas similares a Unix porque también tienen un echo dominio. Algunas de las otras soluciones propuestas son más específicas de la plataforma.

Por supuesto, puedes poner el texto que quieras en lugar de “saltar”. Cuando ejecuta la celda, simplemente imprimirá este texto en lugar de ejecutar el código en la celda.

  • Funciona en Hydrogen en Ubuntu

    – wjandrea

    21 de noviembre de 2021 a las 22:18


  • Funciona mucho mejor que %% false ya que no crea un error. Esto es muy bueno si no necesita mantener la salida anterior.

    – Olsgard

    19 oct 2022 a las 6:37

  • En realidad, resulta que esto funciona, pero normalmente crea un error (ignorado) en Windows a menos que tenga un comando de eco en su ruta (por ejemplo, al instalar cygwin, gnuwin32, bash, etc.)

    – dabru

    19 oct 2022 a las 15:51

  • También funciona maravillosamente en Google Colab…

    – Reuven

    31 de enero a las 5:16

Si no se espera que se carguen resultados almacenados en caché, encuentro el Freeze nbextension bastante útil para este fin.

ingrese la descripción de la imagen aquí

Aunque no es oficial, recomiendo encarecidamente probar estas extensiones de portátiles si nunca las ha usado antes.

Para instalar la maquinaria de extensión,

$ pip install jupyter_contrib_nbextensions && jupyter contrib nbextension install

Para habilitar el Freeze extensión, lanzamiento jupyter notebook y abra un nuevo cuaderno, desde el menú, seleccione Edit > nbextensions configy luego verifique Freeze.

Esta pregunta es un poco más antigua, pero parece que falta la respuesta más conveniente. Puede utilizar las ‘celdas de inicialización’ de NBextensions. Una vez instalado/activado, puede marcar celdas en cualquier cuaderno como “celdas de inicialización” que luego se pueden ejecutar con un botón específico.

  • Instalar NBextensions:aquí
  • Active las ‘celdas de inicialización’ cuando inicie el panel de jupyter

  • En su cuaderno, en el menú ‘ver’, elija ‘barra de herramientas de celda’ y luego ‘celda de inicialización’

  • Junto a cada celda ahora hay una casilla de verificación. Marque todas las celdas que desea ejecutar para la inicialización
  • Al volver a abrir un cuaderno, haga clic en el botón que parece una calculadora de bolsillo para ejecutar todas las celdas de inicialización.

Rajan Verma - Avatar de usuario de Aarvy
Rajan Verma – Aarvy

La forma más sencilla de omitir la ejecución del código Python en la celda del cuaderno jupyter, convierto temporalmente esas celdas en rebajas.

avatar de usuario de wjandrea
andrea

El %%script false solución dejó de funcionar en algún momento en 2019.

Aquí hay algunas otras soluciones disponibles. Estos se basan en programas que ignoran sus argumentos cuando les dices que no esperen ninguno. Aquí hay algunos ejemplos fáciles:

Perl:

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

Aquí estás ejecutando: perl -e '0' cellcontents

Una versión más memorable:

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

Aquí estás ejecutando: perl -e 'at' cellcontents

Intento:

%%bash -c :

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

: es un no-op en bash, por lo que está ejecutando: bash -c : cellcontents

No he mirado el código de implementación de magia externa, pero estoy bastante seguro de que los “contenidos de celda” se pasan como argumentos y no serán interpretados por Shell por error, digamos si tuviera que incluir ; en ellos e inyectar accidentalmente un código incorrecto. Pero no puedo garantizarte eso.

Estoy seguro de que puede encontrar otras soluciones creativas, mirando los programas compatibles aquí: https://ipython.readthedocs.io/en/stable/interactive/magics.html#cell-magics

  • %%script false –no-raise-error funciona para el Jupyter que probé hoy

    –David Fiocco

    19 de enero de 2020 a las 21:09


  • de hecho, lo hace, pero es demasiado largo para escribir y recordar… Idealmente, ipython debería tener un %%script noop o algo similar, por lo que es una función y no una solución.

    – estación

    19 de enero de 2020 a las 22:34

  • ¿Por qué soluciones tan complicadas? Hay un comando POSIX que siempre devuelve verdadero. Puedes usar: %%script true

    – pabouk – Ucrania se mantiene fuerte

    4 de junio de 2022 a las 12:24

¿Ha sido útil esta solución?