Pull to refresh

Создаём простую командную оболочку на Python (Часть 1)

Всем доброго времени суток, господа! Суть данного цикла статей в том, что мы посмотрим, как можно использовать на практике модули 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

Как мы видим, наша оболочка ещё беззубая, но принцип её работы мы показали. Продолжение следует!
Tags:
Hubs:
You can’t comment this publication because its author is not yet a full member of the community. You will be able to contact the author only after he or she has been invited by someone in the community. Until then, author’s username will be hidden by an alias.