Рубрики
Без рубрики

Изменение каталога с менеджером контекста Python

Прыгайте, затем из каталога с Python. Теги с Python, программированием, контекстуманагерами, промежуточным.

Первоначально опубликовано на thomaseckert.dev

В моем последнем проекте я добавил Tailwind и Vue в приложение для колбы. Это требует дополнительного шага сборки для компиляции каждого использования NPM во время развертывания. Учитывая, что Python уже присутствует на сервере к тому времени, когда возникает этап сборки, я решил написать сценарий сборки в Python.

Те, кто написал сценарии по сборке, прежде чем могут быть знакомы с рисунком изменения в каталог, выполняющие команды, затем возвращаются в исходный каталог, чтобы начать следующий набор команд. Это было именно то, что мне нужно было сделать здесь:

  1. Изменить каталог на ./tailwind

    1. Выполнить NPM установить установить зависимости
    2. Выполнить NPM запустить сборку Чтобы скомпилировать CSS Castwind
  2. Изменить каталог Находятся
  3. Изменить каталог ./vue.

    1. Выполнить NPM установить установить зависимости
    2. Выполнить NPM запустить сборку Чтобы скомпилировать приложение Vue

Это казалось, что идеально подходит для менеджера контекста Python. Контекстные менеджеры позволяют создать экземпляр контекста, используя с ключевое слово. Контекст расположен, когда код вынесен взимается. Использование контекстно-менеджера для изменения каталогов здесь устранит изменение каталога относительного пути на шаге 2, после того, как первый шаг завершен, каталог будет автоматически сброшен на то, что он был до начала контекста.

Начиняя правильный менеджер контекста set_directory Я мог бы реализовать сценарий сборки как

from pathlib import Path

with set_directory(Path("./tailwind")):
    run_npm_install()
    run_npm_build()
with set_directory(Path("./vue")):
    run_npm_install()
    run_npm_build()

И я думал, что это был довольно сладкий!

Контекстные менеджеры могут быть записаны как классы или функции. Учитывая относительную простоту этого контекста, я решил использовать функцию. Функция менеджера контекста должна быть украшена @ContextManager который импортируется из Contextlib . У него должно быть попробуйте Блок с доходность и а Наконец блокировать. Когда контекст создается с использованием с ключевое слово, попробуйте Блок работает. Когда блок кода с отступом оставлен, Наконец Блок работает. Например,

from contextlib import contextmanager

@contextmanager
def friendly_context():
    try:
        print("Hello! Welcome to the context!")
        yield
    finally:
        print("Bye now. Thank you for visiting the context. Come again soon.")

with friendly_context():
    print("Oh thank you, it is so nice to be in the context.")

При выполнении будет печать

Hello! Welcome to the context!
Oh thank you, it is so nice to be in the context.
Bye now. Thank you for visiting the context. Come again soon.

Чтобы написать мой каталог, изменяющий контекстный менеджер, мне нужно было сохранить исходный путь к переменной, измените его в попробуйте Блок к тому, что было передано в функцию, затем измените на исходный путь в Наконец блокировать.

from contextlib import contextmanager
from pathlib import Path

import os

@contextmanager
def set_directory(path: Path):
    """Sets the cwd within the context

    Args:
        path (Path): The path to the cwd

    Yields:
        None
    """

    origin = Path().absolute()
    try:
        os.chdir(path)
        yield
    finally:
        os.chdir(origin)

И это работает как шарм! Дайте мне знать, если вы нашли крутое использование для контекстных менеджеров или решили бы эту проблему по-другому.

Оригинал: “https://dev.to/teckert/changing-directory-with-a-python-context-manager-2bj8”