Seminar z programovania v sietach - Python


Úvod

Python je interpretovaný, interaktívny programovací jazyk. Začal vznikať v roku 1989 vo výskumnom ústave v Amsterdame. Vytvoril ho Guido van Rossum, pôvodne ako skriptovací jazyk pre Amoeba OS schopný systémových volaní. Názov jazyka vôbec nevznikol z názvu druhu hada. Autor nazval jazyk podľa populárneho britského satirického seriálu Monty Python's Flying Circus. Ale napriek tomu sa názov jazyka často asociuje práve s hadom a nie s filmom. Je vyvíjaný ako open source projekt, a je v súčasnosti pri verzii 3.1.2. Python podporuje objektovo orientované, štruktúrované aj funkcionálne programovanie.

Je to dynamicky typový jazyk, podporuje veľké množstvo vysokoúrovňových dátových typov a na správu pamäte používa garbage collection. Zdrojové kódy interpretra Pythonu a štandardné knižníce sú volne dostupné na stiahnutie z domovskej stránky Pythonu http://www.python.org/ a je možné ich ďalej volne modifikovať a distribuovať. Na tejto stránke tiež najdete množstvo odkazov na dalšie moduly, programy a nástroje určené použivateľom Pythonu. Je to programovací jazyk pre minimalistov, presne podľa motta "less is more". Pri jeho vývoji stavili na tieto koncepty:

Python a vývin grafických užívateľských rozhraní (GUI)

Python je mnohými považovaný za jeden z tých, ak nie najpoprednejším jazykom pre tvorbu GUI kvôli jeho rapídnej možnosti zmeny. Prešiel štandardnými rozhraniami pre implementáciu prenositeľných GUI, ktoré vyzdvihujú prirodzený vzhľad a cit podkladovej platformy, čo je veľmi silná vlastnosť. Python môže byť tiež použitý pre vývoj GUI na špecifickej platforme Windows, X Windows alebo Macintosh, a KDE a GNOME rozhrania pre Linux.

Python a vývoj webových aplikácií

Naviac ľahko manipuluje s HTML, Python prišiel so štandardným modulom pre sockety, skriptovanie na strane servera, spracovanie XML, FTP a viac. A čo viac, existuje nerozoznateľné Python/Java integrácia nazvaná JPython, ktoré Vám umožní vytvoriť applety na strane klienta a komunikovať s Java knižnicami.

Programovanie v Pythone

Python je zďaleka jedným z najčitateľnejších jazykov, ktoré sa dnes používajú. Hoci to neznamená, že Python tvorí objemný kód. V skutočnosti, väčšina programátorov zistí, že môžu napísať na dva, tri riadky Pythonu, čo predtým zabralo desať alebo viac riadkov v C++.

Porovnanie Pythona s Javou a C++:

Java

Programy napísané v jazyku Python bežia obyčajne pomalšie ako Java programy, na druhej strane však vyžadujú menej času na vývoj. Python programy sú typicky 3 až 5 krát kratšie ako ekvivalentné Java programy. Tento rozdiel vyplýva z toho, že Python má zabudované vysoko-úrovňové dátové typy a dynamické pretypovanie. Python programátor sa nemusí zapodievať napr. deklarovaním typov premenných alebo argumentov funkcií.

C++

To isté čo o Jave platí aj o jazyku C++ a naviac: ak Python kód je typicky 3-5 krát kratší ako Java kód, tak pri C++ je to 5-10 krát. Hovorí sa, že jeden Python programátor dokáže dokončiť za dva mesiace to, čo nedokážu dokončiť dvaja C++ programátori za rok.

Inštalácia

Na webe http://www.python.org/ nájdete verzie pre operačn systémy Windows, Linux, Mac OS X a dalšie.

Začíname

Ak máme nainštalovaný python a cestu máte v PATH tak pre spustenie interpretera do príkazového riadku zadáme python a stlačíme Enter a mali by sme dostať nejaký takýto výpis.

Microsoft Windows [Version 6.1.7600]
Copyright (c) 2009 Microsoft Corporation. Všetky práva vyhradené. 
C:\Users\Maros>python 
Python 2.7 (r27:82525, Jul  4 2010, 07:43:08) [MSC v.1500 64 bit (AMD64)] on win
32 
Type "help", "copyright", "credits" or "license" for more information. 
>>>               
Interpreter pythonu môžeme spúšťať aj priamo kliknutím na python.exe v adresári, kde sme ho nainštalovali. Interpret ukončíme kombinací Ctrl-Z(platí pre Windows), krížikom alebo zadáme:
import sys
sys.exit()              
Teraz si môžeme vyskušať niektoré jednoduché príkazy:
>>> print "Hello, world"
Hello, world
>>> x = 12*2
>>>x/2
12
>>> # toto je komentar              
Podľa zavedenej konvencie pythonovské súbory maju koncovku * .py . Teda napríklad helloworld.py. Stačí do neho napisat print 'Hello World!' a spustiť príkazom python helloworld.py. Výsledok:
C:\Users\Maros>python  helloworld.py 
Hello, world!              

Viac sa dozviete na odkazoch:

Rýchlokurz jazyka

Premenné

Do premenných ukladáme čísla, reťazce a ďalšie dátové štruktúry. Pričom sa premenné nedeklarujú ale typ premennej je určený automaticky. Meno premennej môže obsahovať písmená, čísla a podtržítka '_'. Python rozlišuje medzi malými a veľkými písmenami. Nesmú sa tiež používať rezervované slová.

    >>> passe = 3            # bez chyby
    >>> pass = 3             # chyba, pass je rezerovane slovo
    >>> x, y, z = 1, 2, 3    # x=1, y=2, z=3
    >>> x = y = z = 0        # x=0, y=0, z=0             

Viac o premenných, výrazoch a príkazoch na odkazoch:

Čísla

Python rozlišuje mezi číslami celými (integer a long integer), reálnými a imaginárními:

num1 = 123         # klasický 32bitový integer.
num2 = 123456789L  # dlhý integer, obmedzený je len veľkosťou operačnej pamäte
num3 = 987.654     # reálne číslo
num4 = 321j        # imaginárne číslo
num5 = 1 + 3.1415j # komplexné číslo
num6 = num7 = 0    # viacnásobné priradenie
num1 += 10         # spojené operátory              

Viac o číslach a operáciach nad nimi v dokumentácii, alebo na odkazoch:

Sekvenčné dátové typy

V Pythone sú sekvenčnými dátovymi typmi reťazce, polia a tuple. Pri reťazcoch sa za sekvenciu považujú jednotlivé znaky, pri tuple a poliach sú to jednotlivé prvky. Ku všetkým sekvenčným dátovým typom môžeme pristupovať pomocou indexov alebo slice notácie. Reťazce a tuple sú nemenné, prvky polí sa dajú meniť!

Základné funkcie pre prácu so sekvenčnými dátovými typmi:

min(s)vráti najmensí prvok zo sekvencie s
max(s)vráti najväcsí prvok zo sekvencie s
len(s)vráti počet prvkov v poli alebo tuple pri použití na retazec jeho dĺžku
s1 + s2spojí sekvenciu s1 so sekvenciou s2
seq * xopakuje sekvenciu seq x-krát, pričom x musí byť prirodzené číslo

Ďalší odkaz na všeobcne popisane Dátové typy:

Tuple

Tuple je prvím zo sekvenčních typou. Patrí medzi tzv. immutable sekvencie, po jeho vytvorení sa nedajú jeho prvky meniť.

>>> t1 = (1, 2, 3, 4)        # jednotlivé prvky tuple sa zapisuju oddelene čiarkou,
>>> t2 = 1, 2, 3, 4          # zátvorky niesu povinné
>>> t3 = (1, ’jedna’, ’one’) # môže obsahovať prvky rôzných typov
>>> t4 = ()                  # práznu tuple získame takto , nieje možné vynechať zátvorky
>>> t5 = (2, )               # tuple o jednom prvku - nesmieme zabudnut na čiarku
>>> tuples = (t1, t2, t3)    # daju sa do tuple vložiť aj iné tuple           

Nejaké odkazy o tuple:

Polia - Zoznamy

Je obdobou typu tuple. Jediným rozdielom je, že zoznam je sekvencia premenných, tj. jednotlivé prvky zoznamu môžeme meniť.

>>> s1 = [1, 2, 3, 4]               # používame hranaté zátvorky
>>> s2 = []                         # prázdny zoznam
>>> s3 = [2]                        # zoznam o jednom prvku
>>> s=['python', 'je', 'jazyk']
>>> s[2]=['skriptovaci', 'jazyk']   #vnorenie dalšieho pola
>>> s
['python', 'je', ['skriptovaci', 'jazyk']]
>>> s[2][1]                         #pristup pomocou dvojitého indexovania
'jazyk'          

Niektoré funkcie na prácu so zoznamami:

a.append(x)na koniec pola a pripojí objekt x
a.extend(P)na koniec pola a pripojí pole P
a.insert(i, x)na pozíciu (index) v poli a, danú argumentom i, priradí hodnotu x
a.remove(x)prepíše prvý prvok pola a s hodnotou x
a.pop(i) zmaže a vráti prvok pola a z pozície i; pri nezadaní argumentu, zmaže a vráti posledný prvok pola
a.index(x)vráti index prvého prvku s hodnotou x v poli a, v prípade, že žiadny prvok pola nemá hodnotu x, vráti chybu
a.count(x)vráti, info o tom, kolkokrát sa nachádza prvok s hodnotou x v poli a
a.sort()zoradí prvky pola a podla abecedy
list(sekvencia)vráti pole, ktorého prvky sú prebraté zo sekvencie
del a[x]zmaže prvok pola a s indexom x, dá sa použit aj so slice notáciou a môže zmazávať celé premenné

Viac o poliach:

Slice konštrukcia

Ďalšou užitočnou konstrukciou je slice, ktorá umožnuje akýkoľvek sekvenční typ doslova „rozrezať na kúsky. Slice podobne ako indexy používa hranaté zátvorky, v ktorých sú, ale uvedené dve celé císla oddelené dvojbodkami.Prvné z čísel znamená dolnu hranicu pre výber prvku, druhé je horná hranica, dokonca nieje chybou, ak sú čísla mimo rozsah platných indexov.

 
>>> zoznam = (1, 2, 3, 4, 5) 
>>> zoznam[3:5]
(4, 5)
>>> zoznam[0:4] 
(1, 2, 3, 4)
>>> zoznam[0:50] 
(1, 2, 3, 4, 5)
>>> zoznam[:3] 
(1, 2, 3)
>>> zoznam[1:] 
(2, 3, 4, 5)
>>> zoznam[:] 
(1, 2, 3, 4, 5)
>>> zoznam[-1:] 
(5,)          

Stringy

Reťazce patria medzi skvenčné dátové typy.Reťazec vytvoríme tak, že obsah premennej uzatvoríme medzi apostrofy alebo medzi úvodzovky

        
>>>"hello"+"world"            # spájanie   
helloworld  
>>>"hello"*3                  # stringy vieme násobiť     
hellohellohello  
>>>"hello"[0]                 # indexovanie
h  
>>>"hello"[-1]                # od konca  
o  
>>>"hello"[1:4]               # substringy 
ell 
>>>len("hello")               # dĺžka
5  
>>>"hello" < "jello"          # porovnanie
1	  
>>>"e" in "hello"             # vyhľadávanie 
1	       

Escapovacie znaky:

\             prázdna escape sekvencia
\\            spätné lomítko (\)
\'            apostrof (')
\"            úvodzovka (")
\a            pípnutie (BEL)
\b            backspace (BS)
\e            escape (ESC)
\n            nový riadok 
\0XX          ASCII znak v oktánovej sústave s hodnotou XX
\xXX          ASCII znak v hexadecimalnej sústave s hodnotou XX             

Niektoré základné funkcie pre prácu s reťazcami

repr(s)vráti argument s v apostrofoch
str(s)vráti argument s ak je retazec, ak s nie je retazec, tak ho konvertuje na retazec a vráti

V úvode použitá funkcia print poskytuje možnosť formatovaného výstupu

 >>> print "Sucet cisla %d a cisla %d je: %d" % (2,5,2+5)
Sucet cisla 2 a cisla 5 je: 7             
%xčíslo v šestnástkovom tvare
%0.3freálne císlo zaokruhlené na tri desatiné miesta
%3dcelé císlo, pričom vľavo sa doplnia medzery tak, aby číslo malo 3 znaky
%03dcelé číslo, pričom vľavo sa doplnia nuly tak, aby číslo malo 3 znaky

Viac o reťazcoch:

Asociatívne pole(Slovník,Mapa)

Ide o pole, kde sa pre indexovánie prvku používá ľubovoľný objekt. Jediné obmedzenie na tieto objekty (kľúč) je, aby z nich bolo možné určiť ich hash. To ide iba pre objekty nemenné (immutable sekvencie, reťazce, čísla a dalšie, viď dokumentacia k Pythonu).

>>> znamky = {’Voprsalek’: 3, ’Macha’: 5, 
... ’Novak’: 1} 
>>> znamky[’Voprsalek’] 
3
>>> znamky[’Macha’] = 4 
>>> znamky[’Svec’] = 2 
>>> znamky 
{’Svec’: 2, ’Macha’: 4, ’Voprsalek’: 3, ’Novak’: 1}  
Objekty typu asociativne pole majú niekoľko metód (clear, copy, get, has key, items, keys, setdefault, update, values).

Viac o mapách:

Riadiace štruktúry a cykly

Python používá iba tri konštrukcie riadenia programu.Sú to if, for a while.

if - konštrukcia

>>> D = 2 
>>> if D > 0: 
... print ’rovnica ma 2 resenia’ 
... elif D == 0:
... print ’rovnica ma 1 resenia’ 
... else:
... print ’rovnica nema resenia’ 
... 
rovnice ma 2 resenia
 

for - konštrukcia

Používa sa na iterovanie cez elementy v sekvenčných dátových typoch alebo iných iterovateľných objektoch Zvláštnosťou Pythonu je, že i cyklus for môže mať časť else, ktorá se vykoná po spracovaní všetkých prvkov sekvencie. Ak je cyklus prerušený pomocou break alebo v jeho tele dôjde k výnimke, časť else sa nevykoná.

>>> sucet = 0
>>> for cislo in range(50):
... sucet += cislo
... else:
... print ’sucet cisel od 0 do 49 je’, sucet
...
sucet cisel od 0 do 49 je 1225
Príklad iterovania zoznamu:
>>> zoznam = [1, 2, 3]
>>> for item in zoznam[:]:
... print ’pridavam’, item
... seznam.append(item)
... else:
... print ’zoznam bol zdvojeny’
...
Ak chcem iterovať zoznam pomocou celých čísel použijeme funkciu range();
>>> range(9)
[0, 1, 2, 3, 4, 5, 6, 7, 8]
>>> range(2, 9)
[2, 3, 4, 5, 6, 7, 8]
>>> range(2, 9, 2)
[2, 4, 6, 8]

while - konštrukcia

>>> cislo = 0
>>> sucet = 0
>>> while cislo < 50:
... sucet += cislo
... cislo += 1
... else:
... print ’sucet cisel od 0 do 49 je’, sucet
...
sucet cisel od 0 do 49 je 1225          
break- ukončenie for alebo while cyklu. continue- ukoncenie iteracie for alebo while cyklu. pass- používa sa ak si syntax vyžaduje príkaz pričom nechceme, aby sa niečo vykonalo.

Viac o riadiacích štruktúrach:

Funkcie

Definícia funkcie je uvedená kľúčovým slovom def. Po kľúčovom slove následujú meno funkcie a formálne argumenty. Následujúce príkazy, tvoria telo funkcie Telo funkcie je blok kódu a preto musí býť odsadené.

>>> def fib(n):    # vypiš Fibonacciho rozvoj do n
...     """Vypiše Fibonacciho rozvoj do n."""  #dokumentácia
...     a, b = 0, 1
...     while b < n:
...         print b,
...         a, b = b, a+b
...

Volanie funkcie:

>>>fib(2000)
1 1 2 3 5 8 13 21 34 55 89 144 233 377 610 987 1597

Príklad

>>> def tiskni_text(answer, text = ’nedefinovan’, pocet = 1):
... for foo in range(pocet):
... print answer, text or ’prazdny retezec’
...
>>> tiskni_text(’Parametr text je’)
Parametr text je nedefinovan
>>> tiskni_text(’Parametr text je’, ’obycejny text’)
Parametr text je obycejny text
>>> tiskni_text(’Parametr text je’, ’obycejny text’, 3)
Parametr text je obycejny text
Parametr text je obycejny text
Parametr text je obycejny text
>>> tiskni_text(answer = ’Parametr text je’, text = ’obycejny text’)
Parametr text je obycejny text
>>> tiskni_text(’Parametr text je’, pocet = 3)
Parametr text je nedefinovan
Parametr text je nedefinovan
Parametr text je nedefinovan
Použitie identifikátorov.Do premennej identifikator sú pri použití syntaxe *identifikator uložené všetky nadbytočné pozičné parametre, pri syntaxy **identifikator všetky nadbytočné keyword parametry.
>>> def tiskni_text(answer, text = ’nedefinovan’, *args, **kwargs):
... print answer, text or ’prazdny retezec’
... print ’zbyvajici pozicni parametry:’, args
... print ’zbyvajici keyword parametry:’, kwargs
...
>>> tiskni_text(’Parametr text je’, ’linux’, ’Ahoj’, server = ’www.root.cz’)
Parametr text je linux
zbyvajici pozicni parametry: (’Ahoj’,)
zbyvajici keyword parametry: {’server’: ’www.root.cz’}

Viac o funkciách:

Moduly

Modul je súbor, obsahujúci definície a príkazy určené pre použitie v iných programoch Pythonu. Mnohé moduly sú štandardnou súčasťou Pythonu a sú uložené v jeho standardnej knižnici.

Importovanie modulu

>>> import sys
>>> from hocico import def1,def2
>>> from hocico import * 
Po importovaní ak napišeme dir(hocico) vypíše sa zoznam funkcií v danom module. Funkciu modul použijeme napr. takto:hocico.def1.

Niektoré moduly:

  • sys niekolko užtočných premenných o systému
  • math matematické funkcie a konštanty
  • time dátum a čas
  • random náhodné čísla

Viac o moduloch:

Práca so súbormi

Výpis súboru:

subor = open("ahoj.txt","r")
for line in subor.readlines():
    print line
subor.close()

Kopirovanie súboru:

subor = open("ahoj.txt","r")
kopia = open("ahoj.bak","w")
for line in subor.readlines():
    kopia.write(line)
    # od verzie 2.0 funguje nova konvencie
    # pre zapis do suboru (z dovodu prehladnosti)
    # print >>> kopia, line
print "subor skopirovany"
subor.close()
kopia.close() 
Výpisanie len prvého riadku
subor = open("ahoj.txt","r") 
lines = subor.readlines() #vrati zoznam riadkov
print lines[0]        
Zápis na koniec
subor = open("ahoj.txt","a") 
subor.write("Text.")
subor.close()        

Modul pickle

Predpokladajme, že chceme do súboru f uložiť nejaký objekt x. Jednoducho tak spravíme pomocu funkcie pickle.dump():
import pickle
pickle.dump(x, f)   #zapis
x = pickle.load(f)  #nacitanie
 

Viac o práci zo súbormi:

Vytvorenie .exe

Modul py2exe umožnuje vytvoriť z daného skriptu samostatný windows program s priponou *.exe. Ak chceme so svojho skript.py súboru urobiť subor skript.exe, tak si napišete k tomu ešte jednoduchý skripk setup.py.

 
# setup.py
from distutils.core import setup
import py2exe
setup(name="skript", scripts=["skript.py"],)       
A všetko to spojíme dokopy jednoduchým prikazom v príkazovom riadku windowsu v mieste, kde sa nachádza python.exe subor. C:\Program Files\Python22>python setup.py py2exe V tomto adresari sa vytvoril nový adresar dist\skript, v ktorom sa nachádza subor skript.exe spoločne so suborom python22.dll.

Objektove programovanie

Objektovo-orientované programovanie je dôležitou súčasťou Pythonu. V Pythone sú všetky atribúty verejné a metódy sú virtuálne. To znamená, že hocikedy môžeme pridávať nové metódy. Python je veľmi dynamický jazyk. Špecifikácie prístupu k atribútom a metódam public, private a protected, známe z iných objektovo orientovaných jazykov Python nepoužíva. Z každej zadefinovanej triedy Python dovoľuje ľubovoľne dediť jej inštancie, t.z. objekty, pričom každý z nich má vlastné charakteristiky a metódy a môže byť teda s každým takýmto objektom manipulované nezávisle od ďalších objektov. To že môžeme triedy definovať v samostatných súboroch a neskôr importovať tieto súbory len na miestach, kde chceme danú triedu použiť, nám umožňuje udržiavať zdrojový kód modulárny a jednoducho meniteľný.

Viac o objektovom programovaní v pythone:

O čom sme ešte nehovorili?

V tejto prezentácií nespomenieme vlákna v Pythone,rôzne pokročilé techniky, grafiku, teda GUI,chyby a výnimky, perzistencia objektov, komunikácia medzi procesmi atď. To všetko sa dozviete na webe v rôznych tutorialoch a v dokumentácií.

Python a internet

SMTP

Klientská časť protokolu SMTP, viď http://www. faqs.org/rfcs/rfc821.htmlje v Pythone implementovaná v modulu smtplib. Ďalšie moduly, ktoré sa starajú o maili sú imaplib, poplib. Modul smtplib poskytuje triedu SMPT. Pomocu jej metód sa môžeme pripájať k SMTP serveru ,odosieľať e-mail a odpojiť sa.

 
import smtplib
import sys
od = raw_input("Od: ")
pro = raw_input("Pro: ")
predmet = raw_input("Predmet: ")
msg = ("From: %s\r\nTo: %s\r\nSubject: %s\r\n\r\n"
% (od, pro, predmet))
print "Zadajte text správy, ukoncete stiskem ^Z na samotnom riadku:"
msg += sys.stdin.read()
server = smtplib.SMTP(’localhost’)     #  zadáme SMTP server
server.sendmail(od, pro, msg)
server.quit()

FTP

Tu len v krátkosti. Na obsluhu FTP protkolu je v pythone implementovaný modul ftplib.

HTTP

Pre prácu s klientskou častou protokolu HTTP má python modul httplib. Obsahuje triedy HTTPConnection a HTTPResponse. Viac v dokumentácií.

>>> from httplib import HTTPConnection
>>> conn = HTTPConnection(’www.root.cz’)
>>> conn.request(’GET’, ’/’)
>>> r = conn.getresponse()
>>> print r.status, r.reason
200 OK
>>> data = r.read()
>>> conn.close()

Modul urllib

Modul urllib je vysokoúrovňová nadstavba mad moduly httplib a ftplib.Dokáže otvorit súbory pomocu protokolu HTTP a FTP a nakoniec vráti súborový objekt, ktorý má rovnake rozhranie ako štandarný súborový objekt vrátaní funkciou open().Tento program nám vypiše html dokument na tejto adrese

 
# -*- coding: utf-8 -*-
from urllib import urlopen
f = urlopen("http://www.root.cz")
r = f.read()
print r 

Modul urllib2

Tento modul rozširuje funčnost modulu urllib2. Príklad:

import urllib2
url = 'http://tycho.usno.navy.mil/cgi-bin/timer.pl'
for line in urllib2.urlopen(url):
  if 'EST' in line or 'EDT' in line:  
    print line
    
    

Nov. 25, 09:43:32 PM EST

Sockety

Pre low level access použijeme modul socket. Socket vytvorime pomocou metódy:

s = socket.socket()
Metódy pre Serverový Socket
Method Description
s.bind() This method binds address (hostname, port number pair) to socket.
s.listen()This method sets up and start TCP listener.
s.accept()This passively accept TCP client connection, waiting until connection arrives (blocking).
Metódy pre Klientský Socket
Method Description
s.connect() This method actively initiates TCP server connection.
Ostatné metódy
Method Description
s.recv() This method receives TCP message
s.send() This method transmits TCP message
s.recvfrom() This method receives UDP message
s.sendto() This method transmits UDP message
s.close() This method closes socket
socket.gethostname()Returns the hostname.

Jednoduchý server pomocu socketov

import socket               # Import socket module
s = socket.socket()         # Create a socket object
host = socket.gethostname() # Get local machine name
port = 12345                # Reserve a port for your service.
s.bind((host, port))        # Bind to the port
s.listen(5)                 # Now wait for client connection.
while True:
   c, addr = s.accept()     # Establish connection with client.
   print 'Got connection from', addr
   c.send('Thank you for connecting')
   c.close()                # Close the connection
 

Jednoduchý klient pomocu socketov

import socket               # Import socket module
s = socket.socket()         # Create a socket object
host = socket.gethostname() # Get local machine name
port = 12345                # Reserve a port for your service.
s.connect((host, port))
print s.recv(1024)
s.close                     # Close the socket when done
   

Viac o internete a Pythone:

Ďalšie moduly čo sa týka internetu a pythonu: webbrowser ,cgi,wsgiref,uuid,telnetlib,nntplib,xmlrpclib atď.

Príklad na Python a CGI

form.html

 <html>
	<head>
		<title>python</title>
	</head>
	<body>
		<form action="form.py" method="post">
		<div>
			From: <input type="text" name="from"/><br/>
			To: <input type="text" name="to"/><br/>
			Text: <br/><textarea name="text" rows="10" cols="60"></textarea><br/>
			<input type="submit" value="Posli E-mail (POST)"/>
		</div>
		</form>
	</body>
</html>     

form.py

#!C:\Python22\python.exe
import cgi, os, string
print 'Content-type: text/html'
print
argums = cgi.parse(cgi.sys.stdin)		#nacitame argumeny !!! zbieram data od POSTu, nie GETu
d = {}
for x in argums.keys():
      d[x] = string.split(argums[x][0], '\r\n')
print '<html><body>'
print '<b>Mail posiela</b>: %s<br>' % d['from'][0]
print '<b>Posleme to na adresu</b>: %s<br>' % d['to'][0]
print '<b>Text emailu je</b>:<br>'
for x in d['text']:
    print x,'<br>'
print '</body></html>'     

Úlohy

  1. Máme súbor ahoj.txt, ktorý ma tvar:

    ahoj ako sa mas?

    Vytvorte program, ktorý bude mať funkciu pocetslov(s),kde s je vstupný string, ktorá ráta počet slov v stringu a funkciu pocetvyskytov(pismeno,veta), ktorá vráti počet vyskytov pismena vo vete. V programe otvorte súbor ahoj.txt a zrátajte počet slov v súbore a vypíšte počet výskytov pismena a vo vete. vysledok:
    D:\>python vypis.py               
    subor ma 4 slova
    veta ma 4 vyskytov pismena a        
    
  2. Vytvorte klient-server aplikáciu, takýmto spôsobom. Klient sa pripojí k serveru, ktorý príjma správy od klienta. Po tom co sa klient prihlási, server vypíše na konzolu informáciu o tom z akej IP a na akom porte vzniklo spojenie. Pomocou klienta odosleme správu na server, ktorú na server vráti. Komunikáciu ukončíme napr. stisknutim znaku ESC (v pythone qEOCq) a potom stlačiť Enter. Server odošle spätne správu s poďakovaním o pripojení a komunikáciu zaloguje (uloží)) do súboru log.txt v tvare: From IP-adresa received: + sprava1 + sprava2 príklad komunikacie klienta:

    D:\>python simpleklient.py
    ==========Sprava na odoslanie============
    >>> ahoj
    Spatne ziskana sprava: >>>   ahoj
    >>> ako sa mas?
    Spatne ziskana sprava: >>>   ako sa mas?
    >>>
    Thank you for connecting
    príklad komunikacie servra:
    D:\>python simpleserver.py
    Got connection from ('192.168.0.158', 51231)
    Prenesene data:   + ahoj + ako sa mas?              #prenesene data sa ulozia do suboru
    
    príklad výpisu súboru log.txt:
    From 192.168.0.158 received:  + sssssssssssssssssss + q
    From 192.168.0.158 received:  + ahoj + ako sa mas?

Zdroje a rôzne odkazy

  1. http://www.python.org/
  2. http://docs.python.org/tutorial/
  3. http://sk.wikipedia.org/wiki/Python
  4. http://geon.wz.cz/buwralug/
  5. http://www.ammo.sk/indexx.htm?rub=1&co=349
  6. http://www.py.cz
  7. http://howto.py.cz/index.htm
  8. http://ii.iinfo.cz/r/old/data/letajici_cirkus.pdf
  9. http://macek.sandbox.cz/texty/python-tutorial-cz/tut/
  10. http://mikee.micarp.sk/school/sps-python/