Python Kurs - Dan 3

You might also like

Download as pptx, pdf, or txt
Download as pptx, pdf, or txt
You are on page 1of 22

PYTHON KURS

Institut RT-RK Banja Luka

CONFIDENTIAL – Reproduction prohibited without the prior permission of RT-RK 1


MODULI I PAKETI

● Distribucija koda

CONFIDENTIAL – Reproduction prohibited without the prior permission of RT-RK 2


MODULI

● Veliki dijelovi koda, biblioteke, su organizovani u module.


● Standardna Python instalacija dolazi sa velikim brojem modula.
● Bilo koji Python izvorni kod može da se koristi kao modul.
● Za uključivanje modula u izvorni kod koristi se
import ime_modula

● U modulu mogu biti definisane klase, funkcije i globalne promenljive.


● Primjer:
#modul #program
def spam(eggs): import modul
print eggs
#poziv funkcije iz modula
modul.spam("test")

CONFIDENTIAL – Reproduction prohibited without the prior permission of RT-RK 3


MODULI I IMPORT

● Pri importovanju modula, modul u stvari bude izvršen.


● Ako se u modulu osim definicija klasa, promjenljivih i funkcija nalaze
izvršni izrazi, biće izvršeni pri importovanju.
● Primjer:
class Spam(object):
def __init__(self,eggs):
self.eggs = eggs
print "Ovo ce biti izvrseno pri importovanju"
● Ime importovanog modula može biti promjenjeno:
import spam as eggs
a = eggs.Spam("test")
● Importovanje ne mora biti na početku fajla, a može biti i uslovno:
if format == "xml":
import xmlreader as reader
elif format == "csv":
import csvreader as reader
data = reader.read_data(filename)
CONFIDENTIAL – Reproduction prohibited without the prior permission of RT-RK 4
SELEKTIVNO IMPORTOVANJE

● Kada ne želimo čitav modul.


● from modul import definicija <as ime>
● Izbjegavamo novi namespace
from math import sqrt
sqrt(45)
from os import *
system("dir")
from socket import socket as sock
s = sock()

CONFIDENTIAL – Reproduction prohibited without the prior permission of RT-RK 5


PUTANJE I NALAŽENJE MODULA

● Pri importovanju se vrši pretraga za traženim modulom.


● Lista direktorijuma u kojima se vrši pretraga se nalazi u
sys.path.
● Prvi direktorijum koji se pretražuje je trenutni , CWD.
● Kako je sys.path obična lista, može se dodati putanja za
pretragu.
● Postoji podrška za arhive.

import sys
print sys.path
sys.path.append("neka_putanja")
sys.path.append("zipovani_moduli.zip")
sys.path.append("zipovani_moduli.zip/lib/")

CONFIDENTIAL – Reproduction prohibited without the prior permission of RT-RK 6


PAKETI

● Nekad je zgodno module organizovati u pakete, čime formiramo


biblioteke.
● Tematski slični moduli se grupišu u pakete čime se smanjuje
problem s namespace-ovima.
● Paket je u Pythonu predstavljen direktorijumom.
● Svaki paket sadrži __init__.py fajl, module i/ili podpakete.
● __init__.py može da sadrži kod za inicijalizaciju paketa, a može
i da bude prazan.
● Biva pokrenut pri prvom importovanju modula iz paketa.
import Paket.PodPaket.modul1
k = Paket.PodPaket.modul1.Klasa()
import Paket.PodPaket.modul2 as modul2
k = modul2.Klasa()

CONFIDENTIAL – Reproduction prohibited without the prior permission of RT-RK 7


DISTRIBUCIJA KODA

● Za distribuciju programa, biblioteka ili paketa koristi se distutils.


● Napraviti direktorijum koji sadrži module i pakete, README i
dokumentaciju.
biblioteka\
modul.py
paket\
__init__.py
modul1.py
program.py
setup.py
README

● Za "pakovanje" napraviti setup.py u direktorijumu.


from distutils.core import setup
setup(name = "biblioteka",
version = "1.0",
py_modules = ['modul'],
packages = ['paket'],
scripts = ['program.py'],
)

CONFIDENTIAL – Reproduction prohibited without the prior permission of RT-RK 8


DISTRIBUCIJA KODA CONT.

● Distribuciju pravimo pokretanjem:


python setup.py sdist

● Napravljena arhiva biva smestena u dist\.


● Ovako zapakovana biblioteka/program može biti
distribuiran.
● Instalacija se vrši na sličan način:
python setup.py install

CONFIDENTIAL – Reproduction prohibited without the prior permission of RT-RK 9


INSTALACIJA BIBLIOTEKA I PIP

● Biblioteke koje nisu deo standardne Pythod distribucije se mogu naći na


sajtu.
● Mogu se instalirati ili na prethodno opisani način, skidanjem arhive i
pokretanjem setup.py ili putem paket menadžera.
● pip - pip installs packages
● Pip se prvo mora instalirati - get-pip.py skripta

python setup.py install

● Treba podesiti i PATH do c:\Python27\Scripts.


● Nakon toga, u terminalu:

pip install ime_paketa


pip install simplejson
pip uninstall simplejson

● Pip u stvari odradi sve korake oko instalacije umesto vas.

CONFIDENTIAL – Reproduction prohibited without the prior permission of RT-RK 10


IO

IO
Argumenti, okruženje, fajlovi, serijalizacija

CONFIDENTIAL – Reproduction prohibited without the prior permission of RT-RK 11


TORKE

● Uobičajeno je da programi pri pokretanju primaju


argumente sa komandne linije.
● Python interpreter argumente komandne linije
smješta u sys.argv listu.
● Argumentima pristupamo kao i bilo kojoj drugoj listi:
import sys

print ’Broj argumenata:', len(sys.argv), ’argumen(a)t(a).'


print ’Lista argumenata:', str(sys.argv)

if len(sys.argv) != 2:
print "Način korištenja: %s <argument>"%sys.argv[0]
else:
print "%s"%hex(int(sys.argv[1]))

CONFIDENTIAL – Reproduction prohibited without the prior permission of RT-RK 12


PROMENLJIVE OKRUŽENJA

● Često je neophodno pročitati promenljive okruženja


kao što su PATH, USER ili neke specifičnije.
● U modulu os rečnik environ sadrži promenljive
okruženja.
import os
print os.environ["PATH"]
print os.environ["USER"]

● Pošto je u pitanju rečnik, nove promenljive


dodajemo lako:
import os
print os.environ["PATH"]
os.environ["NOVA_PROMENLJIVA"] = "NOVA_VREDNOST_PROMENLJIVE_OKRUZENJA"

CONFIDENTIAL – Reproduction prohibited without the prior permission of RT-RK 13


RUKOVANJE FAJLOVIMA

● Fajlovima se rukuje ugradjenom funkcijom


open(filename,options)
● U opcijama specificiramo koji način pristupa želimo:
Oznaka Značenje
r read
w write
a append
b binary file - modifikator
+ update - modifikator

CONFIDENTIAL – Reproduction prohibited without the prior permission of RT-RK 14


PREGLED METODA FAJL OBJEKTA

Metoda Značenje

file.read([n]) Čitanje n bajtova ili ceo fajl.


file.readline([n]) Čita jednu liniju iz tekst fajla ili n bajtova linije
file.readlines() Čita sve linije iz fajla u listu linija
file.write(s) Upisivanje sekvence u fajl
f.writelines(l) Upisivanje sekvence linija u fajl
f.close() Zatvaranje fajla
f.tell() Trenutna vrednost offseta unutar fajla
f.seek(offset) Pomeranje na ofset fajla
f.flush() Pražnjenje bafera
f.truncate(n) Skraćivanje fajla na max n bajtova
f.fileno() Broj fajl deskriptora
f.next() Čita sledeću liniju, za iteracije

CONFIDENTIAL – Reproduction prohibited without the prior permission of RT-RK 15


STDIN , STDOUT, STDERR

● Fajl deskriptori za standardni ulaz, izlaz i ispis


greške se nalaze u sys.stdin, sys.stdout i
sys.stderr

● Unos sa tastature se vrši pomoću raw_input()


ime = raw_input("Vaše ime: ")

● Specijalni event-ovi, ctrl-c recimo, rezultuju


KeyboardInterupt izuzetkom i mogu se uhvatiti:
try:
raw_input("Ime:")
except KeyboardInterrupt:
print "Terminated!"

CONFIDENTIAL – Reproduction prohibited without the prior permission of RT-RK 16


UNICODE I/O

● Python 2.7 nema "ugradjenu" podršku za


Unicode.
● Rukovanje Unicode tekstom se vrši pomoću
codecs modula.
codecs.open(filename [, mode [, encoding [, errors]]])
f = codecs.open("unicode.txt","r","utf-8")

● Kodek se može dodati na već otvoreni fajl:


f = open("unicode.txt","r")
fenc = codecs.EncodedFile(f,"utf-8")

CONFIDENTIAL – Reproduction prohibited without the prior permission of RT-RK 17


SERIJALIZACIJA I PICKLE

● Serijalizacija - snimanje objekata na disk.


● pickle zapakuje objekat u obliku bajtova koji mogu da se snime na
disk, posalju preko mreže ...
● pickle.dump(obj,f) snima objekat obj u fajl f.
import pickle
class Test(object):
def __init__(self,data):
self.data = data
test = Test("neki podaci za serijalizaciju")
with open("test.bin","wb") as f:
pickle.dump(test,f)

● pickle.load(f) učitava/deserijalizuje objekat iz fajla


import pickle
class Test(object):
def __init__(self,data):
self.data = data
with open("test.bin","rb") as f:
test = pickle.load(f)
print type(test)
print test.data 18
CONFIDENTIAL – Reproduction prohibited without the prior permission of RT-RK
SERIJALIZACIJA I SHELVE

● Nekada je potrebno serijalizovati veći broj objekata i


pristupati im fleksibilno.
● shelve omogućava serijalizaciju objekata u fajl nalik
rječniku.
import shelve
obj = Test("Objekat za serijalizaciju")
db = shelve.open("test.shelve")
db["test"] = obj
db.close()
db = shelve.open("test.shelve")
obj = db["test"]

● Ključevi u rječniku moraju biti string u ovom slučaju

CONFIDENTIAL – Reproduction prohibited without the prior permission of RT-RK 19


import shelve
SHELVE
flights = {"1":"A", "2":"B", "3":"C"}
times = ["2:30pm", "3:20pm", "4:20pm"]

db = shelve.open("shelved.dat")

print "Prije dodavanja:"


print db

db['flights'] = flights
db['times'] = times

print "Poslije dodavanja:"


print db

db.close()
db = shelve.open("shelved.dat", "r")

for k in db.keys():
obj = db[k]
print "%s: %s" % (k, obj)

flightDB = db['flights']
flights = flightDB.keys()
cities = flightDB.values()
times = db['times']

x = 0
for flight in flights:
print ("Flight %s leaves for %s at %s" % (flight, cities[x], times[x]))
x+=1
db.close()
CONFIDENTIAL – Reproduction prohibited without the prior permission of RT-RK 20
UPRAVLJANJE SERIJALIZACIJOM

● Za komplikovanije objekte, može biti neophodna


kompleksnija serijalizacija i deserijalizacija.
● Pogotovu u slučaju objekata koji zavise od spoljnih
resursa (konekcije, fajlovi, baze...).
● Metode __getstate__() i __setstate__() bivaju
pozvane pri serijalizaciji i deserijalizaciji objekta,
respektivno.
● Metoda __getstate__() treba biti preklopljena tako
da vrati string kojim se može rekonstruisati objekat.
● Metoda __setstate__() kao parametar prima
serijalizovani string i treba je preklopiti tako da
rekonstruiše stanje objekta.

CONFIDENTIAL – Reproduction prohibited without the prior permission of RT-RK 21


PICKLE UPOZORENJA

● Ne postoji nikakav mehanizam validacije


serijalizovanih objekata.
● Ne sme se dozvoliti deserijalizacija ulaza koji nije od
poverenja.
● Zlonamjerni korisnik može preko pickle.load() da
izvrši bilo koji kod u kontekstu programa.
● Ne treba koristiti pickle i shelve za razmenu
podataka izmedju različitih programskih jezika.

CONFIDENTIAL – Reproduction prohibited without the prior permission of RT-RK 22

You might also like