다음을 통해 공유


NotebookUtils를 사용하여 Notebook 아티팩트 관리

Microsoft Fabric에서 프로그래밍 방식으로 전자 필기장 항목을 관리하는 데 사용합니다 notebookutils.notebook . Notebook 아티팩트 만들기, 검색, 업데이트, 삭제 및 나열하여 배포, 수명 주기 관리 및 CI/CD 워크플로를 자동화할 수 있습니다.

메모

이러한 API는 Azure Synapse가 아닌 Fabric Notebook에서만 지원됩니다. 각 작업에 대한 대상 작업 영역에 적절한 권한이 있어야 합니다.

다음 표에서는 사용 가능한 Notebook 관리 방법을 나열합니다.

메서드 Signature 설명
create create(name, description, content, defaultLakehouse, defaultLakehouseWorkspace, workspaceId): Artifact 새 Notebook을 만듭니다.
get get(name, workspaceId): Artifact 이름 또는 ID로 Notebook을 검색합니다.
getDefinition getDefinition(name, workspaceId, format): String Notebook 정의(콘텐츠)를 가져옵니다.
update update(name, newName, description, workspaceId): Artifact Notebook 메타데이터를 업데이트합니다.
updateDefinition updateDefinition(name, content, defaultLakehouse, defaultLakehouseWorkspace, workspaceId, environmentId, environmentWorkspaceId): bool Notebook 설정 및 Lakehouse를 업데이트합니다.
delete delete(name, workspaceId): Boolean 노트북을 삭제합니다
list list(workspaceId, maxResults): Array[Artifact] 작업 영역의 모든 Notebook을 나열합니다.

Notebook 만들기

현재 작업 영역 또는 지정된 작업 영역에서 새 Notebook 아티팩트를 만드는 데 사용합니다 notebookutils.notebook.create() .

메모

이 문서의 워크플로 예제는 .ipynb 파일을 읽거나 쓸 때, 파일 입출력을 위해 Python을 사용합니다. 다른 설명이 없는 한 핵심 notebookutils.notebook API는 Python, PySpark, Scala 및 R에서 사용할 수 있습니다.

매개 변수

매개 변수 유형 필수 설명
name 스트링 새 전자 필기장 이름을 표시합니다. 작업 영역 내에서 고유해야 합니다.
description 스트링 No 노트북에 대한 설명입니다. 기본값은 비어 있는 값으로 기본 설정됩니다.
content 문자열, 바이트 또는 딕셔너리 유효한 JSON 형식의 Notebook 콘텐츠입니다. .ipynb 원시 바이트 또는 딕셔너리 객체일 수도 있습니다. 비워 둘 수 없습니다.
defaultLakehouse 스트링 No 연결할 기본 레이크하우스의 이름 또는 ID입니다.
defaultLakehouseWorkspace 스트링 No 기본 레이크하우스의 작업 영역 ID입니다. "현재 작업 영역을 비워 두세요."
workspaceId 스트링 No 대상 작업 영역 ID입니다. 현재 작업 영역에 대해 비워 둡니다.

중요합니다

매개 변수는 content 비워 둘 수 없습니다. 전자 필기장을 만들 때 유효한 .ipynb 형식 콘텐츠를 제공해야 합니다. 최소한 유효한 빈 Notebook 구조를 제공합니다.

{
  "cells": [],
  "metadata": {},
  "nbformat": 4,
  "nbformat_minor": 5
}

템플릿에서 Notebook 만들기

# Read notebook template from a file
with open("/path/to/template.ipynb", "r") as f:
    notebook_content = f.read()

# Create the notebook
notebook = notebookutils.notebook.create(
    name="ProcessingNotebook",
    description="Data processing notebook from template",
    content=notebook_content
)

print(f"Created notebook: {notebook.displayName} (ID: {notebook.id})")

기본 레이크하우스를 사용하여 Notebook 만들기

# Minimum valid notebook content - content cannot be empty
minimal_content = '''{
    "cells": [],
    "metadata": {},
    "nbformat": 4,
    "nbformat_minor": 5
}'''

# Create notebook with default lakehouse configuration
notebook = notebookutils.notebook.create(
    name="DataAnalysis",
    description="Analysis notebook with lakehouse access",
    content=minimal_content,
    defaultLakehouse="MyLakehouse",
    defaultLakehouseWorkspace=""  # Current workspace
)

print(f"Created notebook with lakehouse: {notebook.displayName}")

반환 값

메서드는 create() 다음 속성을 가진 Artifact 개체를 반환합니다.

  • displayName: 노트북의 표시 이름입니다.
  • id: 만든 Notebook의 고유 식별자입니다.
  • description: 노트북의 설명입니다.

다른 작업 영역에서 Notebook 만들기

with open("/path/to/notebook.ipynb", "r") as f:
    content = f.read()

notebook = notebookutils.notebook.create(
    name="SharedNotebook",
    description="Notebook for the shared workspace",
    content=content,
    workspaceId="bbbbbbbb-2222-3333-4444-cccccccccccc"
)

print(f"Created in remote workspace: {notebook.displayName}")

템플릿에서 여러 Notebook 만들기

# Load template content (must be valid .ipynb)
with open("/path/to/template.ipynb", "r") as f:
    template_content = f.read()

regions = ["US", "EU", "Asia"]

created_notebooks = []
for region in regions:
    notebook = notebookutils.notebook.create(
        name=f"Process_{region}",
        description=f"Processing notebook for {region} region",
        content=template_content,
        defaultLakehouse=f"Lakehouse_{region}"
    )
    created_notebooks.append(notebook)
    print(f"Created: {notebook.displayName}")

print(f"\nCreated {len(created_notebooks)} notebooks")

팁 (조언)

전자 필기장을 쉽게 찾을 수 있도록 의미 있는 이름과 설명을 제공합니다. 자동화된 배포와 같은 <Project>_<Purpose>_<Region> 일관된 명명 규칙을 사용합니다.

노트북 가져오기

이름 또는 ID별로 Notebook 메타데이터를 검색하는 데 사용합니다 notebookutils.notebook.get() . Artifact, displayName, 및 id 같은 속성을 가진 개체description를 반환합니다.

매개 변수

매개 변수 유형 필수 설명
name 스트링 검색할 Notebook의 이름 또는 ID입니다.
workspaceId 스트링 No 작업 영역 ID입니다. 현재 작업 영역을 비워 두십시오.

현재 작업 영역에서 Notebook 가져오기

notebook = notebookutils.notebook.get("MyNotebook")

print(f"Notebook Name: {notebook.displayName}")
print(f"Notebook ID: {notebook.id}")
print(f"Description: {notebook.description}")

다른 작업 영역에서 Notebook 가져오기

workspace_id = "bbbbbbbb-2222-3333-4444-cccccccccccc"
notebook = notebookutils.notebook.get("SharedNotebook", workspaceId=workspace_id)

print(f"Retrieved: {notebook.displayName} from workspace {workspace_id}")

반환 값

메서드는 get() 다음 속성을 가진 Artifact 개체를 반환합니다.

  • displayName: 노트북의 표시 이름입니다.
  • id: 고유 식별자입니다.
  • description: 노트북의 설명입니다.

팁 (조언)

업데이트 또는 삭제 작업 전에 대상 Notebook이 있는지 확인하는 데 사용합니다 get() . 새 전자 필기장을 만들기 전에 전자 필기장 이름이 이미 사용 중인지 확인하는 데 사용할 수도 있습니다.

노트북 정의를 가져오기

전체 전자 필기장 콘텐츠를 .ipynb 형식으로 검색하는 데 notebookutils.notebook.getDefinition()를 사용합니다. 백업, 마이그레이션, 버전 제어 또는 콘텐츠 분석에 사용합니다.

매개 변수

매개 변수 유형 필수 설명
name 스트링 전자 필기장의 이름 또는 ID입니다.
workspaceId 스트링 No 작업 영역 ID입니다. 현재 작업 영역을 비워 두십시오.
format 스트링 No 출력 형식 기본값은 "ipynb"입니다.

Notebook 정의 검색 및 저장

# Retrieve notebook definition as .ipynb content
notebook_content = notebookutils.notebook.getDefinition("MyNotebook")

# Save to a file for backup
with open("/path/to/backup/MyNotebook.ipynb", "w") as f:
    f.write(notebook_content)

print("Notebook definition retrieved and saved")

다른 작업 영역에서 Notebook 정의 가져오기

workspace_id = "cccccccc-3333-4444-5555-dddddddddddd"
notebook_content = notebookutils.notebook.getDefinition(
    name="SharedNotebook",
    workspaceId=workspace_id,
    format="ipynb"
)

print(f"Retrieved definition from workspace {workspace_id}")

반환 값

이 메서드는 getDefinition() JSON 형식의 Notebook 콘텐츠를 포함하는 문자열을 .ipynb 반환합니다.

백업을 위해 모든 Notebook 내보내기

import os
from datetime import datetime

def export_all_notebooks(backup_dir="/path/to/backups"):
    """Export all notebooks in the workspace for backup."""

    timestamp = datetime.now().strftime("%Y%m%d_%H%M%S")
    export_dir = f"{backup_dir}/backup_{timestamp}"
    os.makedirs(export_dir, exist_ok=True)

    notebooks = notebookutils.notebook.list()
    print(f"Exporting {len(notebooks)} notebooks to {export_dir}")

    exported_count = 0
    for nb in notebooks:
        try:
            content = notebookutils.notebook.getDefinition(nb.displayName)
            filename = f"{export_dir}/{nb.displayName}.ipynb"
            with open(filename, "w") as f:
                f.write(content)
            exported_count += 1
            print(f"Exported: {nb.displayName}")
        except Exception as e:
            print(f"Failed to export {nb.displayName}: {e}")

    print(f"\nExported {exported_count} of {len(notebooks)} notebooks")
    return export_dir

backup_location = export_all_notebooks()

전자 필기장 업데이트

notebookutils.notebook.update()을 사용하여 표시 이름 및 설명과 같은 Notebook 메타데이터를 변경합니다. Notebook 콘텐츠 또는 레이크하우스 구성은 변경하지 않습니다.

매개 변수

매개 변수 유형 필수 설명
name 스트링 전자 필기장의 현재 이름 또는 ID입니다.
newName 스트링 Notebook의 새 표시 이름입니다.
description 스트링 No 설명이 업데이트되었습니다.
workspaceId 스트링 No 작업 영역 ID입니다. 현재 작업 영역을 비워 두십시오.

Notebook 이름 바꾸기

updated_notebook = notebookutils.notebook.update(
    name="OldNotebookName",
    newName="NewNotebookName",
    description="Updated description with more details"
)

print(f"Updated notebook: {updated_notebook.displayName}")

반환 값

메서드는 update() 업데이트된 속성이 있는 Artifact 개체를 반환합니다.

노트북 정의 업데이트

notebookutils.notebook.updateDefinition()를 사용하여 Notebook 콘텐츠, 기본 레이크하우스 또는 둘 다를 수정할 수 있습니다. 메타데이터 대신 Notebook 정의를 변경해야 하는 경우 사용합니다.

매개 변수

매개 변수 유형 필수 설명
name 스트링 업데이트할 Notebook의 이름 또는 ID입니다.
content 스트링 No .ipynb 형식의 새 전자 필기장 콘텐츠입니다.
defaultLakehouse 스트링 No 새 기본 레이크하우스 이름입니다.
defaultLakehouseWorkspace 스트링 No 새 기본 레이크하우스의 작업 영역 ID입니다. 현재 작업 영역을 비워 두십시오.
workspaceId 스트링 No 작업 영역 ID입니다. 현재 작업 영역을 비워 두십시오.
environmentId 스트링 No Notebook에 첨부할 환경 ID입니다.
environmentWorkspaceId 스트링 No 환경의 작업 영역 ID입니다. 현재 작업 영역을 비워 두십시오.

메모

environmentIdenvironmentWorkspaceId 매개 변수는 Spark 노트북 런타임에서만 사용할 수 있습니다. Python Notebook은 이러한 매개 변수를 지원하지 않습니다.

전자 필기장 콘텐츠 업데이트

# Load new content
with open("/path/to/updated_notebook.ipynb", "r") as f:
    new_content = f.read()

is_updated = notebookutils.notebook.updateDefinition(
    name="MyNotebook",
    content=new_content
)

print(f"Notebook definition updated: {is_updated}")

기본 레이크하우스 변경

is_updated = notebookutils.notebook.updateDefinition(
    name="MyNotebook",
    defaultLakehouse="NewLakehouse",
    defaultLakehouseWorkspace=""  # Current workspace
)

print(f"Default lakehouse updated: {is_updated}")

콘텐츠와 레이크하우스를 모두 업데이트합니다.

with open("/path/to/new_version.ipynb", "r") as f:
    new_content = f.read()

is_updated = notebookutils.notebook.updateDefinition(
    name="MyNotebook",
    content=new_content,
    defaultLakehouse="ProductionLakehouse",
    defaultLakehouseWorkspace=""
)

print(f"Notebook fully updated: {is_updated}")

반환 값

이 메서드는 updateDefinition() 업데이트가 성공하거나 True 실패하는 경우 반환 False 됩니다.

팁 (조언)

update()는 메타데이터 변경(이름, 설명)에 사용하고, updateDefinition()는 콘텐츠 및 레이크하우스 변경에 사용합니다. 메타데이터와 콘텐츠의 전체 새로 고침이 필요한 경우 두 메서드를 순서대로 호출합니다.

노트북 삭제하기

notebookutils.notebook.delete()을(를) 사용하여 작업 영역에서 노트북을 영구적으로 제거합니다. 삭제가 성공하면 반환 True 되며, 그렇지 않으면 반환됩니다 False.

매개 변수

매개 변수 유형 필수 설명
name 스트링 삭제할 전자 필기장의 이름 또는 ID입니다.
workspaceId 스트링 No 작업 영역 ID입니다. 현재 작업 영역을 비워 두십시오.

중요합니다

삭제는 영구적입니다. 삭제된 전자 필기장을 복구할 수 없습니다. 삭제하기 전에 항상 노트북 이름을 확인하고, 먼저 노트북 정의를 getDefinition()로 백업하는 것이 좋습니다.

반환 값

delete() 삭제가 성공하거나 True 실패하는 경우 메서드가 반환 False 됩니다.

노트북 삭제하기

is_deleted = notebookutils.notebook.delete("ObsoleteNotebook")

if is_deleted:
    print("Notebook deleted successfully")
else:
    print("Failed to delete notebook")

패턴별로 전자 필기장 안전하게 정리

def cleanup_notebooks(name_pattern, dry_run=True):
    """Delete notebooks matching a name pattern."""

    notebooks = notebookutils.notebook.list()
    to_delete = [nb for nb in notebooks if name_pattern in nb.displayName]

    print(f"Found {len(to_delete)} notebooks matching '{name_pattern}':")
    for nb in to_delete:
        print(f"  - {nb.displayName}")

    if dry_run:
        print("\nDRY RUN - No notebooks deleted")
        return

    deleted_count = 0
    for nb in to_delete:
        if notebookutils.notebook.delete(nb.displayName):
            deleted_count += 1
            print(f"Deleted: {nb.displayName}")
        else:
            print(f"Failed to delete: {nb.displayName}")

    print(f"\nDeleted {deleted_count} of {len(to_delete)} notebooks")

# Always run with dry_run=True first to preview
cleanup_notebooks("temp_", dry_run=True)

팁 (조언)

안전한 대량 삭제를 위해, 먼저 dry_run=True을 실행하여 제거될 노트북을 미리 확인하십시오. 필요한 경우 복구할 수 있도록 전자 필기장을 즉시 삭제하는 대신, 접두사 _TO_DELETE가 있는 이름으로 전자 필기장을 변경하는 것을 고려해 보세요.

노트 목록

notebookutils.notebook.list()를 사용하여 작업 영역에서 노트북을 열거합니다. 개체 배열 Artifact 을 반환합니다.

매개 변수

매개 변수 유형 필수 설명
workspaceId 스트링 No 작업 영역 ID입니다. 현재 작업 영역을 비워 두십시오.
maxResults 정수 (Int) No 반환할 최대 결과 수입니다. 기본값은 1000입니다.

현재 작업 영역의 모든 Notebook 나열

notebooks = notebookutils.notebook.list()

print(f"Found {len(notebooks)} notebooks:")
for nb in notebooks:
    print(f"  - {nb.displayName} (ID: {nb.id})")

다른 작업 영역의 Notebook 나열

workspace_id = "cccccccc-3333-4444-5555-dddddddddddd"
notebooks = notebookutils.notebook.list(workspaceId=workspace_id)

print(f"Found {len(notebooks)} notebooks in workspace {workspace_id}")

반환 값

메서드는 list() 개체의 배열을 Artifact 반환합니다. 각 개체에는 displayName, iddescription 속성이 포함됩니다.

이름 패턴별로 Notebook 필터링

all_notebooks = notebookutils.notebook.list()

# Filter for notebooks that start with a specific prefix
processing_notebooks = [nb for nb in all_notebooks if nb.displayName.startswith("Process_")]

print(f"Found {len(processing_notebooks)} processing notebooks:")
for nb in processing_notebooks:
    print(f"  - {nb.displayName}")

전자 필기장 복제

list()getDefinition()를 함께 사용하여 동일한 작업 영역 내 또는 다른 작업 영역으로 Notebook을 복제합니다.

def clone_notebook(source_name, target_name, target_workspace=""):
    """Clone a notebook by retrieving its content and creating a copy."""

    source = notebookutils.notebook.get(source_name)
    content = notebookutils.notebook.getDefinition(source_name)

    cloned = notebookutils.notebook.create(
        name=target_name,
        description=f"Clone of {source_name}",
        content=content,
        workspaceId=target_workspace
    )

    print(f"Cloned {source_name} to {cloned.displayName}")
    return cloned

cloned_notebook = clone_notebook("TemplateNotebook", "NewInstance")

Notebook을 다른 작업 영역으로 마이그레이션

def migrate_notebook(name, target_workspace_id, new_name=None):
    """Migrate a notebook from the current workspace to another workspace."""

    content = notebookutils.notebook.getDefinition(name)
    target_name = new_name if new_name else name

    migrated = notebookutils.notebook.create(
        name=target_name,
        description=f"Migrated from {name}",
        content=content,
        workspaceId=target_workspace_id
    )

    print(f"Migrated {name} to workspace {target_workspace_id} as {target_name}")
    return migrated

target_ws = "dddddddd-4444-5555-6666-eeeeeeeeeeee"
migrated_nb = migrate_notebook("DataPipeline", target_ws, "DataPipeline_v2")