Actualiza el environment de tus notebooks de manera programática

Autor

Kilian Baccaro Salinas

Categoría

PySpark

Tiempo de lectura

02 min de lectura

Fecha de publicación

08 sep, 2025

Cuando trabajamos con muchos notebooks en Microsoft Fabric, mantener actualizado el environment asociado puede ser tedioso si tenemos que hacerlo manualmente uno por uno.

Por suerte, gracias a la librería Semantic-Link-Labs, podemos automatizar esta tarea y actualizar el environment de nuestros notebooks de manera sencilla y programática.

Semantic-Link-Labs nos ofrece varias funciones muy útiles para esta tarea:

  • list_notebooks → lista los notebooks dentro de un área de trabajo.

  • list_environments → muestra los entornos definidos en el workspace (o en otro que especifiques).

  • get_notebook_definition → obtiene la definición completa de un notebook.

  • update_notebook_definition → actualiza un notebook con los cambios que necesitemos.

Para la prueba, tengo en un área de trabajo un environment y un notebook asociado a este

Lo primero es instalar la librería en nuestro notebook:

%pip install semantic-link-labs

Obteniendo la definición del notebook

Utilizamos la función get_notebook_definition para ver el contenido del notebook:

import sempy_labs as labs

labs.get_notebook_definition(notebook_name="Notebook 1", format="ipynb")

La salida será un JSON parecido a este:

{
	"cells": [...],
	"metadata": {
		...
		"dependencies": {
			"environment": {
				"environmentId": "49277563-ad74-49a1-b791-247964afa14a",
				"workspaceId": "69445ea5-e0e6-456d-810b-a291e9b8cae9"
			}
		}
	},
	"nbformat": 4,
	"nbformat_minor": 5
}

La parte que nos interesa está dentro de dependencies, donde se encuentra el environment asignado al notebook.

Eliminando el environment

Si lo que queremos es cambiar el environment al predeterminado, basta con eliminar la referencia actual:

import sempy_labs as labs
import json

notebook_name = "Notebook 1"

definition = labs.get_notebook_definition(notebook_name=notebook_name, format="ipynb")
definition = json.loads(definition)

if (
    "metadata" in definition and
    "dependencies" in definition["metadata"] and
    "environment" in definition["metadata"]["dependencies"]
):
    print(f"Actualizando notebook: {notebook_name}")
    definition["metadata"]["dependencies"]["environment"] = {}

    updated_definition_str = json.dumps(definition)

    labs.update_notebook_definition(name=notebook_name, notebook_content=updated_definition_str, format="ipynb")

Al abrir el notebook de nuevo, verás que aparece el environment por defecto.

Asignando un nuevo environment

También podemos cambiar el notebook para que apunte a otro environment (incluso en otra área de trabajo):

notebook_name = "Notebook 1"
environment_id = "38d5bb5e-897e-44d7-927c-e902590da88c"
workspace_id = "e42acae6-20f9-4929-a0b8-345b096b0217"

definition = labs.get_notebook_definition(notebook_name=notebook_name, format="ipynb")
definition = json.loads(definition)

if (
    "metadata" in definition and
    "dependencies" in definition["metadata"] and
    "environment" in definition["metadata"]["dependencies"]
):
    print(f"Actualizando notebook: {notebook_name}")

    definition["metadata"]["dependencies"]["environment"] = {"environmentId": environment_id, "workspaceId": workspace_id}
    updated_definition_str = json.dumps(definition)

    labs.update_notebook_definition(name=notebook_name, notebook_content=updated_definition_str, format="ipynb")

Al reabrir el notebook, verás el nuevo environment asignado.

¿Cómo puedo obtener el environmentId?

Con la función list_environments podemos listar fácilmente todos los entornos disponibles:

Si no pasamos ningún parámetro, se buscarán los environments en el área de trabajo actual. También podemos especificar otro workspace si queremos reutilizar environments definidos en otro lugar.

Automatización para todos los notebooks de un área de trabajo

Si trabajamos en proyectos grandes con decenas o cientos de notebooks, lo ideal es automatizar el proceso. Con este ejemplo, actualizamos en bloque todos los notebooks de un área de trabajo:

notebooks_df = labs.list_notebooks()

for _, row in notebooks_df.iterrows():
    notebook_id = row["Notebook Id"]
    notebook_name = row["Notebook Name"]
    print(f"{notebook_id} - {notebook_name}")

    definition = labs.get_notebook_definition(notebook_name=notebook_name, format="ipynb")
    definition = json.loads(definition)

    if (
        "metadata" in definition and
        "dependencies" in definition["metadata"] and
        "environment" in definition["metadata"]["dependencies"]
    ):
        print(f"Actualizando notebook: {notebook_name}")

        definition["metadata"]["dependencies"]["environment"] = {}
        updated_definition_str = json.dumps(definition)

        labs.update_notebook_definition(
            name=notebook_name,
            notebook_content=updated_definition_str,
            format="ipynb"
        )
    else:
        print("Este notebook no tiene environment definido.")