Всем доброго времени суток, господа! Суть данного цикла статей в том, что мы посмотрим, как можно использовать на практике модули os и shutil, а именно создадим простую командную оболочку. С её помощью мы сможем копировать, перемещать и удалять файлы, создавать и удалять папки, менять текущую директорию и т.д. Давай-те перейдём к делу!
Для начала разберёмся со структурой программы. Она будет состоять из главного цикла, лексера и самого интерпретатора. Лексер — это такая штуковина, разбивающая строку на токены, с которыми собственно и будет работать интерпретатор. Вот и его код:
Как мы видим, он разбивает строку на команду и аргумент. Теперь займёмся главной частью оболочки — интерпретатором. Пусть для начала он будет способен менять текущую директорию, выводить строку на экран, выходить из оболочки и выдавать сообщение об ошибке. Мы будем использовать две функции модуля os: getcwd() для вывода текущей директории и chdir() для её смены:
И теперь момент истины! Весь код костяка оболочки:
Как мы видим, наша оболочка ещё беззубая, но принцип её работы мы показали. Продолжение следует!
Для начала разберёмся со структурой программы. Она будет состоять из главного цикла, лексера и самого интерпретатора. Лексер — это такая штуковина, разбивающая строку на токены, с которыми собственно и будет работать интерпретатор. Вот и его код:
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
Как мы видим, наша оболочка ещё беззубая, но принцип её работы мы показали. Продолжение следует!