06_Ключевые_механизмы_работы.md - YaroslavGit28/os.sys-PY GitHub Wiki

06. Ключевые механизмы работы


6.1. Меню и цикл обработки команд

Главный цикл:

  • очищает экран;
  • печатает шапку и меню;
  • читает выбор пользователя;
  • вызывает одну из 16 учебных функций os.*;
  • возвращает управление после pause().
def main() -> None:
    while True:
        clear_screen()
        print_header()
        show_menu()

        choice = input("Ваш выбор: ").strip()

        if choice == "1":
            list_dir()                 # os.listdir
            pause()
        elif choice == "2":
            list_dir_scandir()         # os.scandir
            pause()
        elif choice == "3":
            change_dir()               # os.chdir / os.getcwd
            pause()
        # ...
        elif choice == "0":
            print("Выход из программы.")
            break

6.2. Управление текущей директорией

CURRENT_DIR — переменная состояния, которая:

  • инициализируется как Path(os.getcwd());
  • обновляется при переходах в change_dir();
  • синхронизируется с процессом через os.chdir.

Ключевые функции синхронизации:

def _sync_cwd_from_os() -> None:
    global CURRENT_DIR
    CURRENT_DIR = Path(os.getcwd())

def _sync_os_from_current_dir() -> None:
    os.chdir(CURRENT_DIR)

6.3. Основные группы вызовов os.*

Список и пути

os.listdir(CURRENT_DIR)
os.scandir(CURRENT_DIR)
os.path.join(CURRENT_DIR, name)
os.path.exists(target)
os.path.isdir(target)

Файлы и папки

os.mkdir(target)
os.makedirs(target_nested)
os.remove(file_path)
os.rmdir(dir_path)
os.rename(src, dst)
os.replace(src, dst)

Метаданные и доступ

os.stat(target)
os.utime(target, None)
os.access(target, os.R_OK)

Окружение и система

os.getenv("USERNAME")
os.environ["FILE_MANAGER_DEMO"] = "1"
os.getpid()
os.cpu_count()

Вызовы внешних программ через os.system

def clear_screen():
    if os.name == "nt":
        os.system("cls")
    else:
        os.system("clear")

def open_explorer():
    os.system(cmd)

def open_shell_here():
    os.system(cmd)

Это демонстрирует:

  • широкий спектр API os в одном проекте;
  • различие между файловыми вызовами os.* и shell-вызовами os.system;
  • кроссплатформенную ветвизацию команд.

6.4. Диаграмма «Python ↔ ОС»

sequenceDiagram
    participant U as Пользователь
    participant P as Python (file_manager.py)
    participant OS as Операционная система

    U->>P: Выбор пункта меню (например, 10)
    P->>P: Формирование target через os.path.join
    P->>OS: os.stat(target) / os.path.getmtime(target)
    OS-->>P: Метаданные файла
    P-->>U: Печать информации

6.5. Разбор кода по шагам: show_file_info()

target = os.path.join(CURRENT_DIR, name)
if not os.path.exists(target):
    print("Такого файла/папки нет.")
    return

print(os.path.abspath(target))
print(os.path.isfile(target), os.path.isdir(target))
print(time.ctime(os.path.getmtime(target)))

st = os.stat(target)
print(st.st_size, st.st_mode, st.st_mtime)

Пояснение:

  1. os.path.join — собирает корректный путь из директории и имени.
  2. os.path.exists — ранняя проверка, чтобы избежать исключения в os.stat.
  3. os.path.abspath — нормализованный абсолютный путь для пользователя.
  4. os.path.isfile/isdir — тип объекта (файл или папка).
  5. os.path.getmtime + time.ctime — время последнего изменения в читаемом виде.
  6. os.stat — детальные технические метаданные.

Почему это полезно в учебном проекте:

  • на одном примере видно и “простые” проверки os.path.*, и “глубокую” статистику через os.stat;
  • легко объяснить, какую функцию брать в какой ситуации.