Первоначально опубликовано на thomaseckert.dev
В моем последнем проекте я добавил Tailwind и Vue в приложение для колбы. Это требует дополнительного шага сборки для компиляции каждого использования NPM
во время развертывания. Учитывая, что Python уже присутствует на сервере к тому времени, когда возникает этап сборки, я решил написать сценарий сборки в Python.
Те, кто написал сценарии по сборке, прежде чем могут быть знакомы с рисунком изменения в каталог, выполняющие команды, затем возвращаются в исходный каталог, чтобы начать следующий набор команд. Это было именно то, что мне нужно было сделать здесь:
Изменить каталог на
./tailwind
- Выполнить
NPM установить
установить зависимости - Выполнить
NPM запустить сборку
Чтобы скомпилировать CSS Castwind
- Выполнить
- Изменить каталог
Находятся
Изменить каталог
./vue.
- Выполнить
NPM установить
установить зависимости - Выполнить
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”