Biblioteka standardowa

Wprowadzenie

Biblioteka standardowa Pythona zawiera ogromną liczbę przydatnych modułów i jest częścią każdej standardowej instalacji Pythona. Dobrze jest zapoznać się z nią, gdyż wiele problemów może być szybko rozwiązanych, jeżeli znasz się na jej zakresie możliwości.

Poznamy kilka najczęściej używanych modułów z tej biblioteki. Szczegółowy opis wszystkich elementów możesz znaleźć w dokumentacji Pythona w sekcji dotyczącej właśnie biblioteki standardowej (strona w jęz. angielskim).

Uwaga
Jeżeli ten rozdział okaże się dla ciebie zbyt skomplikowany, możesz go pominąć, ale radzę ci do niego wrócić, gdy już się trochę obeznasz z Pythonem.

Moduł sys

Moduł sys zawiera narzędzia związane z systemem. Już wcześniej zauważyliśmy, że sys.argv zwraca listę poleceń linii komend.

Przypuśćmy, że chcemy sprawdzić wersję Pythona, jaką używamy, żeby, powiedzmy, upewnić się, że używamy wersji 2.x, a nie 3.x. Moduł sys nam to umożliwia w następujący sposób:

>>> import sys
>>> sys.version_info
(2, 6, 4, 'final', 0)
>>> sys.version_info[0] == 2
True

Jak to działa:

Moduł sys ma krotkę version_info, która zawiera informację o wersji. Pierwszym elementem jest główny numer wersji. Możemy to wykorzystać, aby, powiedzmy, umożliwić programowi działanie jedynie w Pythonie 2.6.

#!/usr/bin/env python
# -*- coding: utf-8 -*-
# Nazwa pliku: wersja.py

import sys, warnings
if (sys.version_info[0] != 2) or (sys.version_info[1] != 6):
    warnings.warn("Ten program działa tylko w Pythonie 2.6!",
        RuntimeWarning)
else:
    print 'Działa normalnie.'

Rezultat:

$ python2.5 wersja.py
wersja.py:8: RuntimeWarning: Ten program działa tylko w Pythonie 2.6!
  RuntimeWarning)

$ python2.6 wersja.py
Działa normalnie.

Jak to działa:

Używamy innego modułu zwanego warnings, który wyświetla użytkownikowi ostrzeżenia. Jeśli wersja Pythona to nie 2.6, wysyłamy odpowiednie ostrzeżenie.

Moduł logging

Co zrobić, gdybyś chciał zapisywać ważne wiadomości dotyczące działania i błędów w programie, żeby na bieżąco wiedzieć, czy coś się nie popsuło? Jak można „gdzieś zapisać” te informacje? Otóż używając modułu logging.

Przykład:

#!/usr/bin/env python
# -*- coding: utf-8 -*-
# Nazwa pliku: log.py

import os, platform, logging

if platform.platform().startswith('Windows'):
    logging_file = os.path.join(os.getenv('HOMEDRIVE'), os.getenv('HOMEPATH'), 'test.log')
else:
    logging_file = os.path.join(os.getenv('HOME'), 'test.log')

print "Tworzenie logu w", logging_file 

logging.basicConfig(
    level=logging.DEBUG,
    format='%(asctime)s : %(levelname)s : %(message)s',
    filename = logging_file,
    filemode = 'w',
)

logging.debug("Start programu")
logging.info("Coś się dzieje")
logging.warning("Program padł")

Rezultat:

$ python log.py
Tworzenie logu w /home/Swaroop/test.log

(Zakładamy, że ten program uruchomiliśmy w Linuxie. W Windowsie ścieżka będzie wyglądać tak: C:\Users\Swaroop\test.log)

Zawartość test.log powinna wyglądać mniej więcej tak:

2009-09-22 21:11:07,808 : DEBUG : Start programu
2009-09-22 21:11:07,838 : INFO : Coś się dzieje
2009-09-22 21:11:07,838 : WARNING : Program padł

Jak to działa:

Użyliśmy trzech modułów z biblioteki standardowej — modułu os do interakcji z systemem operacyjnym, modułu platform do uzyskiwania informacji o platformie (systemie operacyjnym) oraz modułu logging, aby zapisać nasze informacje w formie logu.

Najpierw ustalamy, z jakim systemem operacyjnym mamy do czynienia, sprawdzając wynik polecenia platform.platform() (dowiesz się więcej, gdy wpiszesz import platform; help(platform)). Jeśli to Windows, sprawdzamy nazwy dysku głównego i folderu domowego, dzięki czemu dostajemy pełny adres miejsca, w którym chcemy zapisać nasz log. W innych systemach operacyjnych w tym celu wystarczy nam znaleźć nazwę folderu domowego.

Używamy funkcji os.path.join, aby połączyć ścieżkę i nazwę pliku logu. Robimy to w ten sposób, zamiast po prostu dodawać nazwy, żeby mieć pewność, że pełna ścieżka będzie się zgadzała z tym, czego oczekuje od nas system.

Konfigurujemy moduł logging w celu zapisania wszystkich wiadomości w specjalnym formacie i do pliku, który sobie wyszczególniliśmy.

Na koniec możemy ustalić wiadomości dotyczące błędów, informacji, ostrzeżeń, a nawet krytycznych zdarzeń. Gdy tylko program został uruchomiony, możemy sprawdzić ten plik i dowiedzieć się, co się działo, mimo, że nic się nie wyświetliło użytkownikowi na ekranie.

Moduły urllib i json

Jak miło by było, gdybyśmy mogli napisać program, który zdobywałby dla nas wyniki przeszukiwania internetu? Zobaczmy.

Możemy to osiągnąć używając dwóch modułów. Pierwszym jest moduł urllib, dzięki któremu możemy uzyskać dostęp do dowolnej strony w internecie. Użyjemy Yahoo! Search do uzyskania wyników wyszukiwania. Szczęśliwym trafem, uzyskamy od nich wyniki w formacie JSON, który możemy bez problemu przetworzyć dzięki modułowi json z biblioteki standardowej.

Przykład:

#!/usr/bin/env python
# -*- coding: utf-8 -*-
# Nazwa pliku: yahoo.py

import sys
if (sys.version_info[0] != 2) or (sys.version_info[1] < 6):
    sys.exit('Ten program wymaga Pythona 2.6+!')

import json
import urllib

# Zdobądź własny APP ID pod adresem http://developer.yahoo.com/wsregapp/
YAHOO_APP_ID = 'jl22psvV34HELWhdfUJbfDQzlJ2B57KFS_qs4I8D0Wz5U5_yCI1Awv8.lBSfPhwr'
SEARCH_BASE = 'http://search.yahooapis.com/WebSearchService/V1/webSearch'

class YahooSearchError(Exception):
    pass

# Wzięte z http://developer.yahoo.com/python/python-json.html
def search(query, results=20, start=1, **kwargs):
    kwargs.update({
        'appid': YAHOO_APP_ID,
        'query': query,
        'results': results,
        'start': start,
        'output': 'json'
    })
    url = SEARCH_BASE + '?' + urllib.urlencode(kwargs)
    result = json.load(urllib.urlopen(url))
    if 'Error' in result:
        raise YahooSearchError(result['Error'])
    return result['ResultSet']

query = raw_input('Co chcesz znaleźć? ')
for result in search(query)['Result']:
    print "%s : %s" % (result['Title'].encode('utf-8'), result['Url'])

Rezultat:

$ python yahoo.py
Co chcesz znaleźć? byte of python
Python - Notes : http://www.byteofpython.info/
San Diego Zoo's Animal Bytes: Python : http://www.sandiegozoo.org/animalbytes/t-
python.html
A Byte of Python : http://www.ibiblio.org/g2swap/byteofpython/read/
Python en:Table of Contents - Notes : http://www.swaroopch.com/notes/Python_en:T
able_of_Contents
Python Byte Solutions - Front Page : http://www.pythonbyte.com/
A Byte of Python : http://www.thehazeltree.org/byteofpython/index.html
32.12. dis — Disassembler for Python bytecode — Python v2.6.2 ... : http://docs.
python.org/lib/bytecodes.html
Byte-of-Python Info Page : http://lists.ibiblio.org/mailman/listinfo/byte-of-pyt
hon
A Byte of Python : http://www.ibiblio.org/swaroopch/byteofpython/files/120/byteo
fpython_120.pdf
17.9 compileall -- Byte-compile Python libraries : http://www.python.org/doc/2.1
/lib/module-compileall.html
Byte of Python : http://www.linuxac.org/forum/memfiles/byteofpython_arabic.pdf
ANIMAL BYTES - Burmese Python : http://www.seaworld.org/animal-info/animal-bytes
/animalia/eumetazoa/coelomates/deuterostomes/chordata/craniata/reptilia/squamata
/burmese-python.htm
A Byte of Python : http://www.dpawson.co.uk/bop.html
A Byte of Python : http://www.colorado.edu/geography/class_homepages/geog_4303_f
08/readings/Swaroop.CH--A_byte_of_python_115.pdf
18.9 compileall -- Byte-compile Python libraries : http://pythonlib.pergamen.hu/
html/lib/module-compileall.html
Byte of Python : http://www.scribd.com/doc/19114571/Byte-of-Python
A light byte of Python : http://timgolden.me.uk/python/iet-talk
compileall --- Byte-compile Python libraries — Python ... : http://iorich.caltec
h.edu/~t/transfer/python-trunk-doc/library/compileall.html
Byte of Python | dgplug : http://dgplug.org/intro/?q=byteofpython
"Byte of Python" Updated! : http://pramode.net/2008/09/05/byte-of-python-updated
/

Jak to działa:

Możemy uzyskać wyniki wyszukiwania z konkretnej strony poprzez podanie w odpowiednim formacie tekstu do wyszukania. Musimy podać wiele opcji, które łączymy używając formatu klucz1=wartość1&klucz2=wartość2 za pomocą funkcji urllib.urlencode.

Więc, na przykład otwórz ten link, a zobaczysz20 wyników dla zapytania „byte of python”. Poprosiliśmy o wynik w formacie JSON.

Łączymy się z tym URL przy użyciu funkcji urllib.urlopen, po czym wynik przesyłamy do funkcji json.load, która go odczytuje i przekształca w obiekt Pythona. Na koniec używamy pętli, aby wyświetlić użytkownikowi rezultat naszego wyszukiwania.

Serie „Module of the Week”

Do poznania jest jeszcze mnóstwo zagadnień, takich jak debugowanie, manipulowanie opcjami linii komend, wyrażenia regularne i wiele innych.

Najlepszym sposobem dalszego poznawania biblioteki standardowej jest czytanie wspaniałych serii Douga Hellmanna „Python Module of the Week” (strona w jęz. angielskim).

Podsumowanie

Poznaliśmy część możliwości biblioteki standardowej Pythona. Radzę ci wczytać się w jej pełną dokumentację, żeby poznać resztę modułów i ich zastosowanie.

W następnej części zajmiemy się różnymi aspektami Pythona, które sprawią, że nasza wycieczka po zakamarkach tego języka będzie bardziej kompletna.

results matching ""

    No results matching ""