Всем доброго времени суток, господа! Суть данного цикла статей в том, что мы посмотрим, как можно использовать на практике модули os и shutil, а именно создадим простую командную оболочку. С её помощью мы сможем копировать, перемещать и удалять файлы, создавать и удалять папки, менять текущую директорию и т.д. Давай-те перейдём к делу!

Для начала разберёмся со структурой программы. Она будет состоять из главного цикла, лексера и самого интерпретатора. Лексер — это такая штуковина, разбивающая строку на токены, с которыми собственно и будет работать интерпретатор. Вот и его код:

def lexer(c): # Лексер
    lex='' # Команда
    arg='' # Аргумент
    l=True # Писать в команду или в аргумент?
    for i in c:
        if i==' ' and l:
            l=False # Теперь будем писать в аргумент
        elif l:
            lex+=i 
        else:
            arg+=i
    return (lex,arg)

Как мы видим, он разбивает строку на команду и аргумент. Теперь займёмся главной частью оболочки — интерпретатором. Пусть для начала он будет способен менять текущую директорию, выводить строку на экран, выходить из оболочки и выдавать сообщение об ошибке. Мы будем использовать две функции модуля os: getcwd() для вывода текущей директории и chdir() для её смены:

def shell(lex,arg): # Интерпретатор
    if lex=='echo': # Эхо
        print(arg)
    elif lex=='exit': # Выход
        return True # Для чего мы возвращаем True станет понятно позднее
    elif lex=='cd': # Смена директории
        try:
            os.chdir(arg) # Функция для смены директории
        except FileNotFoundError: # Если данного пути не существует
            print('Ошибка: Указанный путь не найден.')

И теперь момент истины! Весь код костяка оболочки:

def lexer(c): # Лексер
    lex='' # Команда
    arg='' # Аргумент
    l=True # Писать в команду или в аргумент?
    for i in c:
        if i==' ' and l:
            l=False # Теперь будем писать в аргумент
        elif l:
            lex+=i 
        else:
            arg+=i
    return shell(lex,arg) # Небольшое изменение в лексере
def shell(lex,arg): # Интерпретатор
    if lex=='echo': # Эхо
        print(arg)
    elif lex=='exit': # Выход
        return True
    elif lex=='cd': # Смена директории
        try:
            os.chdir(arg) # Функция для смены директории
        except FileNotFoundError: # Если данного пути не существует
            print('Ошибка: Указанный путь не найден.')
while True: # Главный цикл
    com=input(os.getcwd()+' # ') # Приглашение
    if lexer(com): break # Проверяем, возвращено ли True

Как мы видим, наша оболочка ещё беззубая, но принцип её работы мы показали. Продолжение следует!