Co to jest curses?

Transkrypt

Co to jest curses?
Kurs systemu UNIX
Biblioteki Pythona
1
Wyrażenia regularne
• Aby używać trzeba wykonać import re
• Mamy możliwość skompilowania wyrażenia regularnego,
powstaje obiekt który można dalej używać:
• Przykład:
>>> import re
>>> p = re.compile(’ab*’)
>>> print p
<re.RegexObject instance at 80b4150>
• Podczas kompilacji można włączać pewne opcje, przykładowo
p = re.compile(’ab*’, re.IGNORECASE)
Kurs systemu UNIX
2
Dygresja o napisach
• Jeżeli chcemy wyszukać \section, to oczywiście wyrażenie ma
postać \\section, natomiast odpowiadający mu napis to
’\\\\section’
• Z tego powodu w wyrażeniach regularnych używa się często
„surowych” napisów (raw):
>>> x,y = ’\\’,r’\\’
>>> len(x),len(y)
(1, 2)
Kurs systemu UNIX
3
Standardowe cechy wyrażeń regularnych
• Podobnie jak w AWK działają: +,|, *, ?, [ ], \, .,$
• Tak jak w sed mamy nawiasy (oznaczane ()), oraz możliwość
odwołania się do tego, co dopasowało się do nawiasu (czyli \1,
\2, ...)
• {m,n}, {m} mówią o liczbie wystąpień wzorca z przodu
Kurs systemu UNIX
4
Użyteczne skróty
skrót
znaczenie
\d
[0-9]
\D
[^0-9]
\s
[ \t\n\r\f\v] (biały znak)
\S
[^ \t\n\r\f\v]
\w
[a-zA-Z0-9_]
\W
[^a-zA-Z0-9_]
[\s.,]
można łączyć!
Kurs systemu UNIX
5
Dodatkowe cechy wyrażeń regularnych
• Leniwe wersje * oraz + i ?, oznaczane *?, +?, ??
• Dopasowuje się nie największy, ale najmniejszy fragment
tekstu:
<.*> w tekscie ’<H1>title</H1>’ da cały tekst
<.*?> w tekscie ’<H1>title</H1>’ da ’<H1>’
• (?P<id>[a-zA-Z_]\w*) daje potem możliwość odwoływania
się do nazwy dopasowanego fragmentu,
• (?=...) jeżeli ... pasuje to sprawdzamy, ale nic się nie
konsumuje (można na przykład wyrażać koniunkcję warunków).
Kurs systemu UNIX
6
Metody dla skompilowanych wyrażeń regularnych
• match(s) – sprawdzanie, czy wyrażeni pasuje do napisu
• search(s) – jak wyżej, ale zwraca specjalny obiekt:
dopasowanie
• findall(s) – zwraca listę pasujących napisów
• finditer(s) – zwraca iterator po dopasowaniach
• s jest oczywiście napisem
Kurs systemu UNIX
7
Przykłady
• Znajdź listę liczb w tekście
>>> p = re.compile(r"\d+")
>>> p.findall("123 ala 45+63 3 45")
[’123’, ’45’, ’63’, ’3’, ’45’]
• Co zwraca match?
>>> m = match("123 ala 45+63 3 45")
>>> if m: print m.group(), m.start(), m.end(), m.span()
(’123’, 0, 3, (0, 3))
• finditer zwraca iterator po takich obiektach:
>>> for m in p.finditer("123 ala 45+63 3 45"):
...
print m.span(),
...
(0, 3) (8, 10) (11, 13) (14, 15) (16, 18)
Kurs systemu UNIX
8
Kurs systemu UNIX
9
Moduł re: zastępowanie
• Mamy trzy funkcje:
– split – dzieli słowo na listę, separatorem jest RE
– sub – podstawia słowo w miejsce dopasowania
– nsub – to samo, ale zwraca też liczbę podstawień
• Przykłady:
>>> p = re.compile(r"[\s,.:]+")
>>> p.split("Ala ma kota, tłustego. Piotrek nie.")
[’Ala’, ’ma’, ’kota’, ’tłustego’, ’Piotrek’, ’nie’, ’’]
>>> p.sub("--","Ala ma kota")
’Ala--ma--kota’
• W podstawieniu można używać \1, \2, ...
Kurs systemu UNIX
10
Moduł os
• Podstawowe mechanizmy systemu operacyjnego (w założeniu
niezależne od platformy, w rzeczywistości często Unixowe)
• Niektóre funkcje:
– getcwd() zwraca napis, nazwę bieżącej kartoteki, którą
możemy zmienić za pomocą chdir()
– zawartość bieżącej kartoteki (jako listę) zwraca listdir()
– system(s) wykonuje polecenie powłoki zapisane w napisie s
Kurs systemu UNIX
11
Moduł os.path
• Pobieranie informacji o pliku:
– getsize(path) – rozmiar pliku,
– getmtime(p) – czas ostatniej modyfikacji,
– getatime(p) – czas ostatniego dostępu
• Przeglądanie całego drzewa plików: walk(p,visit,arg): dla
każdego pliku w drzewie katalogów zakotwiczonm w p
wywołuje funkcję visit z argumentami
(arg,nazwakartoteki,lista plików)
Zagadka: jak zrobić listę wszystkich plików?
• Jest tu też wiele innych funkcji.
Kurs systemu UNIX
12
Zadanie
• Przejrzeć wszystkie pliki z rozszerzeniem .py
• Zgłosić wszystkie tabulatory z graficzną informacją gdzie się
znajdują.
• Skorzystamy z mechanizmu potoków (funkcja popen jest w
standardowej unixowej bibliotece języka C)
Kurs systemu UNIX
13
Potoki jako przykład kontaktu z systemem
import string,os
cmd = ’find . -name "*.py" -print’
for file in os.popen(cmd).readlines():
num = 1
name = file[:-1] #bez znaku nowego wiersza
for line in open(name).readlines():
pos = string.find(line,"\t")
if pos >= 0:
print name, num, pos
print ’....’, line[:-1]
print ’....’, ’ ’ * pos + ’*’
num = num + 1
Kurs systemu UNIX
14
Co możemy znaleźć w modułach standardowej
dystrybucji
• Interfejs do Tk, czyli okienka
• Interfejs do curses, czyli jak napisać emacs-a
• Różnego rodzaju protokoły internetowe i obsługa danych
internetowych
• Parsery HTML-a oraz XML-a
Kurs systemu UNIX
15
Biblioteka curses
• Cały ekran jest nasz!
• Od dzisiaj napisanie nowej wersji vi lub emacsa nie będzie
problemem!
Kurs systemu UNIX
16
Co to jest curses?
• Sposób na pisanie pełnoekranowych (znakowych), niezależnych
od terminala aplikacji.
• Pomost pomiędzy programami „linijkowymi” a okienkowymi.
• Biblioteka używana przez takie programy jak vi.
Kurs systemu UNIX
17
Kompilacja z curses
• Należy dołączyc treść pliku curses.h
• Kompilować z opcją -lcurses lub -lncurses
Kurs systemu UNIX
18
Curses w Pythonie
• Bardzo podobna do curses w C, ale pewne dodatkowe
funkcjonalności.
• Podstawowe funkcje dostępne po import curses.
• Inne moduły:
– curses.textpad - okienko do wprowadzania tekstu
– curses.ascii – nazwy znaków ascii + pewne funkcje
narzędziowe operujące na znakach
– curses.panel – okna, które można kłaść na inne okna,
przenosić, zasłaniać
Kurs systemu UNIX
19
Podstawowe pojęcia
• Procedury curses działają na ekranie, oknach i podoknach.
• Standardowo istnieje jedno okno, w C nazywane stdscr
• Struktura ta stanowi ekran logiczny, aby wyniki zobaczyć na
ekranie fizycznym trzeba użyć refresh.
• Używa się współrzędnych y oraz x (w takiej kolejności).
• Punkt (0,0) to zawsze lewy, górny róg.
Kurs systemu UNIX
20
Witajcie w bibliotece
• Program w curses:
import curses
stdscr = curses.initscr() #zwraca okno
stdscr.addstr(5, 5, "Witajcie w bibliotece!")
stdscr.refresh()
curses.napms(2000)
#drzemka 2s
curses.endwin()
• Trzeba otworzyć i zamknąć bibliotekę (initscr, endwin)
• Zmiany widoczne dopiero po refresh
Kurs systemu UNIX
21
Metoda addstr
• Obsługuje cztery zestawy argumentów:
addstr(s)
addstr(s,attr)
addstr(y,x,s)
addstr(y,x,s,attr)
• Wypisuje używając bieżącej pozycji (okno.move(y,x) ją
zmienia),
• Wypisuje znak o podanym kodzie lub napis.
• Atrybut decyduje o kolorze, migotaniu etc
Kurs systemu UNIX
22
Atrybuty
• Zdefiniowane są następujące atrybuty: A_BLINK,A_BOLD A_DIM,
A_REVERSE, A_STANDOUT oraz A_UNDERLINE
• Atrybut to opcja: dla każdego znaku może być włączona lub
wyłączona.
• atrybuty można ustawiać za pomocą attrset, włączać za
pomocą attron oraz wyłączać za pomocą attroff.
• Przykładowo:
from curses import *
...
w.attron(A_BOLD)
w.attroff(A_BLINK)
w.attrset(A_REVERSE | A_BOLD)
Kurs systemu UNIX
23
Kolory
• Trzeba wywołać start_color(), po czym można sprawdzić,
czy has_colors() pozwoli używać kolorów.
• Kolor znaku jest parą składającą się z koloru znaku oraz koloru
tła. Takich par można zdefiniować pewną liczbę:
numerek = 1
curses.init_pair(numerek, curses.COLOR_RED, curses.COLOR_WHITE)
• Są zdefinowane stałe dla kolorów: red, green, blue, yellow,
magenta, cyan, white, black.
• Potem można używać tej pary w atrybucie pisząc:
w.attron(A_BOLD|color_pair(numerek)|
Kurs systemu UNIX
24
Wyjście
• Metody edycyjne. Argumentem jest okno, [y,x] oznacza
opcjonalne współrzędne, jeżeli nie podano współrzędnych to
bierzemy bieżące.
addch([y,x],c)
wypisuje znak
insch([y,x],c)
wstawia znak
insline()
wstawia pustą linię
delch([y,x])
usuwa znak
deleteln()
usuwa linię
• Czyszczenie okna realizujemy metodami erase() oraz
clear(). Druga dodatkowo odświeża.
• Metoda box() obramowuje okno.
Kurs systemu UNIX
25
Klawiatura
• Funkcje czytające z klawiatury sterowane są trybami.
• Do przełączania służą następujące polecenia:
curses.echo()
curses.cbreak()
curses.raw()
curses.noecho()
curses.nocbreak()
curses.noraw()
• echo oznacza wyświetlanie (bądź nie) wczytywanych znaków
• cbreak sprawia, że znaki dostępne są od razu, a nie po
przeczytaniu całej linii.
• raw wyłącza przetwarzanie znaków specjalnych (np CTRL-C)
Kurs systemu UNIX
26
Tryb keypad
• Umożliwia przetwarzanie znaków specjalnych, które normalnie
wysyłają do aplikacji sekwencję znaków rozpoczynającą się
znakiem ESC.
• Gry tryb ten jest włączony to naciśnięcie klawisza specjalnego
daje na wejściu jedną liczbę.
• Jest zdefiniowana pewna liczba stałych np KEY_LEFT, czy
KEY_END.
• Tryb Keypad włącza się i wyłącza dla okna za pomocą metody
keypad
Kurs systemu UNIX
27
Demonstracja trybu Keypad
from curses import *
import string
scr = initscr()
scr.keypad(1)
# włącza tryb keypad
scr.noecho()
scr.clear()
scr.addstr(5,5,"Demonstracja trybu Keypad. Naciśnij ’q’ aby zatrzymać")
scr.move(7, 5)
scr.refresh()
key = getch()
while key != ERR and key != ord(’q’)):
scr.move(7, 5)
scr.clrtoeol()
if key in range(ord(’a’),ord(’z’)+1)) +
range(ord(’A’),ord(’Z’)+1)):
Kurs systemu UNIX
28
print "Klawisz %c" % key
else:
if key == LOCAL_ESCAPE_KEY: scr.addscr("Klawisz Esc")
elif key == KEY_END: scr.addscr("Klawisz END")
elif key == KEY_BEG: scr.addscr("Klawisz HOME")
elif key == KEY_RIGHT: scr.addscr("Kursor w PRAWO")
elif key == KEY_LEFT: scr.addscr("Kursor w LEWO")
elif key == KEY_UP: scr.addscr("Kursor w GORE")
elif key == KEY_DOWN: scr.addscr("Kursor w DOL")
else: scr.addscr("Nie wiem co zrobić z %d" % key)
scr.refresh();
key = getch();
scr.endwin();
Kurs systemu UNIX
29