¿Cómo convierto un cuaderno IPython en un archivo Python a través de la línea de comandos?

6 minutos de lectura

Avatar de usuario de Stefan Krawczyk
Stefan Krawczyk

Estoy buscando usar el *.ipynb archivos como la fuente de la verdad y ‘compilarlos’ programáticamente en archivos .py para trabajos/tareas programadas.

La única forma en que entiendo hacer esto es a través de la GUI. ¿Hay alguna manera de hacerlo a través de la línea de comandos?

  • ¿A qué te refieres con “fuente de la verdad”? Los cuadernos de IPython son solo archivos json. Puede cargarlos y manipularlos como diccionarios de Python. Para el código fuente deberías estar iterando input llaves donde cell_type es igual a ‘código’. Echa un vistazo a esto esquema

    – theta

    13 de junio de 2013 a las 1:03


  • Bueno, quiero almacenar el .ipynb en un repositorio y no los archivos .py. Entonces, como un ‘paso de compilación’, convertiría los archivos .ipynb a .py para uso real por parte del sistema automatizado. Tienes razón, podría simplemente cargar el json y generar solo las celdas de código, pero me preguntaba si ya había algo que hiciera eso por mí 🙂

    – Stefan Krawczyk

    13 de junio de 2013 a las 1:17


avatar de usuario de wwwilliam
guillermo

Si no desea generar una secuencia de comandos de Python cada vez que guarda, o no desea reiniciar el kernel de IPython:

Sobre el línea de comandopuedes usar nbconvert:

$ jupyter nbconvert --to script [YOUR_NOTEBOOK].ipynb

Como un pequeño truco, incluso puedes llamar al comando anterior en un cuaderno IPython por pre-pendiente ! (utilizado para cualquier argumento de línea de comando). Dentro de un cuaderno:

!jupyter nbconvert --to script config_template.ipynb

Antes --to script era agregadola opción era --to python o --to=pythonpero fue renombrado en el movimiento hacia un sistema de cuaderno agnóstico del lenguaje.

  • Si SÍ quieres uno cada vez que lo guardes, en jupyter puedes desencadenar nbconvert a través de ganchos previos o posteriores al guardado: ContentsManager.pre_save_hook abd FileContentsManager.post_save_hook. Agregarías un gancho posterior al guardado jupyter nbconvert --to script [notebook]

    – jaimedash

    3 mayo 2016 a las 16:35


  • ¿Hay alguna manera de hacer lo contrario, es decir, convertir de un script de python a un cuaderno? Por ejemplo, ¿tener algunas cadenas de documentos especializadas que se analizan en celdas?

    – Sujen Shah

    17/01/2017 a las 17:40

  • convertir todos los cuadernos en una carpeta jupyter nbconvert --to script /path/to/notebooks/*.ipynb

    – abierto

    22 de julio de 2017 a las 0:00


  • ¡Gracias, funciona!, pero ¿y si no quiero el # In[ ]: escriba cosas en el script, quiero que esté limpio. ¿Hay alguna forma de hacer eso?

    – Rishabh Agrahari

    31 de enero de 2018 a las 10:48

  • @RishabhAgrahari Lo siguiente parece funcionar para mí. !jupyter nbconvert --to script --no-prompt notebook.ipynb

    – tormenta de bytes

    27 de mayo de 2019 a las 7:09


Avatar de usuario de Břetislav Hájek
Břetislav Hájek

Si desea convertir todo *.ipynb archivos del directorio actual a la secuencia de comandos de python, puede ejecutar el comando de esta manera:

jupyter nbconvert --to script *.ipynb

  • O puede ejecutar: ipython nbconvert –to script *.ipynb

    – Andrei

    23 de diciembre de 2020 a las 11:28

  • para convertir mediante programación como en una función, use esta sintaxis: subprocess.run([‘jupyter’, ‘nbconvert’,ipynb_file,”–to”, “script”,”–output”,r’temp_converted_py’],shell=True) tenga en cuenta que ipynb_file es una variable

    – usuario15420598

    28 de diciembre de 2021 a las 18:49


Aquí hay una forma rápida y sucia de extraer el código de V3 o V4 ipynb sin usar ipython. No comprueba los tipos de células, etc.

import sys,json

f = open(sys.argv[1], 'r') #input.ipynb
j = json.load(f)
of = open(sys.argv[2], 'w') #output.py
if j["nbformat"] >=4:
        for i,cell in enumerate(j["cells"]):
                of.write("#cell "+str(i)+"\n")
                for line in cell["source"]:
                        of.write(line)
                of.write('\n\n')
else:
        for i,cell in enumerate(j["worksheets"][0]["cells"]):
                of.write("#cell "+str(i)+"\n")
                for line in cell["input"]:
                        of.write(line)
                of.write('\n\n')

of.close()

  • La mejor respuesta si no desea instalar ninguna de las herramientas de Jupyter.

    – dacracot

    3 oct 2016 a las 14:38

  • Me gusta esto. Pero descubrí que cuando descargué el formato .py de los portátiles Jupyter, usa finales de línea UNIX aunque estoy en Windows. Para generar lo mismo, agregue el newlines='\n' como tercer argumento en la llamada al archivo de salida abierto. (Python 3.x)

    – Rufus VS

    30 de mayo de 2019 a las 19:19


  • Esta respuesta abre la posibilidad de leer etiquetas y extraer solo aquellas celdas que la tengan. Más difícil de hacer solo a través de la línea de comandos.

    –Pablo Adames

    9 de agosto de 2020 a las 23:57

Siguiendo el ejemplo anterior pero con el nueva versión lib de nbformat :

import nbformat
from nbconvert import PythonExporter

def convertNotebook(notebookPath, modulePath):

  with open(notebookPath) as fh:
    nb = nbformat.reads(fh.read(), nbformat.NO_CONVERT)

  exporter = PythonExporter()
  source, meta = exporter.from_notebook_node(nb)

  with open(modulePath, 'w+') as fh:
    fh.writelines(source.encode('utf-8'))

Avatar de usuario de Wayne
Wayne

jupytexto es bueno tenerlo en su cadena de herramientas para tales conversiones. No solo permite la conversión de un cuaderno a un script, sino que también puede volver del script al cuaderno. E incluso tener ese cuaderno producido en forma ejecutada.

jupytext --to py notebook.ipynb                 # convert notebook.ipynb to a .py file
jupytext --to notebook notebook.py              # convert notebook.py to an .ipynb file with no outputs
jupytext --to notebook --execute notebook.py    # convert notebook.py to an .ipynb file and run it 

  • Aparentemente también hay ipynb-py-convert, mira aquí.

    – Wayne

    10 de enero de 2020 a las 18:34

  • ‘jupytext’ no se reconoce como un comando interno o externo, un programa operativo o un archivo por lotes.

    – Amine Chadi

    31 de marzo de 2020 a las 15:53


  • ¿Lo has instalado @AmineChadi. Ver aquí para saber cómo hacer eso. Si lo está utilizando a través de una computadora portátil como su interfaz de línea de comandos, simplemente puede ejecutar %pip install jupytext en tu cuaderno.

    – Wayne

    31 de marzo de 2020 a las 20:16

avatar de usuario de wwwslinger
wwwslinger

Puede hacerlo desde la API de IPython.

from IPython.nbformat import current as nbformat
from IPython.nbconvert import PythonExporter

filepath="path/to/my_notebook.ipynb"
export_path="path/to/my_notebook.py"

with open(filepath) as fh:
    nb = nbformat.reads_json(fh.read())

exporter = PythonExporter()

# source is a tuple of python source code
# meta contains metadata
source, meta = exporter.from_notebook_node(nb)

with open(export_path, 'w+') as fh:
    fh.writelines(source)

  • Aparentemente también hay ipynb-py-convert, mira aquí.

    – Wayne

    10 de enero de 2020 a las 18:34

  • ‘jupytext’ no se reconoce como un comando interno o externo, un programa operativo o un archivo por lotes.

    – Amine Chadi

    31 de marzo de 2020 a las 15:53


  • ¿Lo has instalado @AmineChadi. Ver aquí para saber cómo hacer eso. Si lo está utilizando a través de una computadora portátil como su interfaz de línea de comandos, simplemente puede ejecutar %pip install jupytext en tu cuaderno.

    – Wayne

    31 de marzo de 2020 a las 20:16

Avatar de usuario de Sachin Hatikankan
Sachin Hatikankan

Entiendo que este es un hilo viejo. Me he enfrentado al mismo problema y quería convertir el archivo .pynb en un archivo .py a través de la línea de comandos.

Mi búsqueda me llevó a ipynb-py-convertir

Siguiendo los pasos a continuación, pude obtener el archivo .py

  1. Instale “pip install ipynb-py-convert”
  2. Vaya al directorio donde se guarda el archivo ipynb a través del símbolo del sistema
  3. Ingrese el comando

> ipynb-py-convert YourFileName.ipynb YourFilename.py

P.ej:. ipynb-py-convert primeros pasos con kaggle-titanic-problem.ipynb primeros pasos con kaggle-titanic-problem.py

El comando anterior creará una secuencia de comandos de python con el nombre “YourFileName.py” y, según nuestro ejemplo, creará getting-started-with-kaggle-titanic-problem.py archivo

¿Ha sido útil esta solución?