!

Dette materialet blir ikke lenger vedlikeholdt. Du vil finne oppdatert materiale på siden: http://borres.hiof.no/wep/

Python
PythonPath
Børre Stenseth
Python >Utvikling

Utvikling av Pythonkode

Hva
Utvikling av Python moduler

Denne modulen beskriver noen enkle grep for å komme raskt igang med utvikling og kjøring av Pythonprogrammer.

Resonnementet er basert på begrepet modul. En Pythonmodul er en fil som inneholder metoder og eksekverbar kode. En modul kan kjøre og den kan refereres fra andre moduler. En modul er ikke det samme som en klasse.

Referanserammen for denne modulen er kjøring av Python på egen maskin. Når vi skal utvikle for nettløsninger er det en del ting i tillegg vi må passe på (rettigheter, linjeskift, eksekveringsdirektiv, debugging). Mer om dette i modulen: CGI

Jeg arbeider på Windows XP/Vista/7 og jeg bruker hovedsaklig Pythons egen IDLE-editor. Det er selvsagt mange andre måter å organisere arbeid med Python på enn det jeg har som referanse her.

Installasjon

Det er enkelt og ubyråkratisk å installere Python på en maskin. Last ned Python fra [1] og angi hvilken katalog installasjonen skal legges i. Python er deretter tilgjengelig i "All programs"-menyen.

Idle

Idle er Pythons egen kjøreomgivelse. Vi kan skrive kode direkt i Idle og få den eksekvert. Et eksempel på hvordan starten på en sesjon i Idle kan se ut:

Python 2.5.1 (r251:54863, Apr 18 2007, 08:51:08) [MSC v.1310 32 bit (Intel)] on win32
Type "copyright", "credits" or "license()" for more information.
    
IDLE 1.2.1      
>>> print 'hello'
hello
>>> 

Vi kan bruke Idle til enkle oppgaver der vi skal ha utført noe direkte, eller dersom vi ønsker å teste ut noe. Vi kan importere andre moduler i Idle. En del av en sesjon:

>>> import math
>>> print math.sqrt(25)
5.0
>>> def areal(h,b):
	return h*b

>>> print areal(2,3)
6
>>> print areal(w,7)

Traceback (most recent call last):
  File "<pyshell#11>", line 1, in <module>
    print areal(w,7)
NameError: name 'w' is not defined
>>> 

Egen modul

Fra idle kan vi be om å få laget et nytt vindu, File / New Window. Det vinduet vi får opp er et vindu der vi kan editere Python. Dersom vi sparer innholdet i dette vinduet med ekstension .py, har vi laget en modul. Vi kan lage et eksempel der vi lager en modul, util.py, med to metoder: getTextFile og storeTextFile:

"""
Read / write text files
"""
def getTextFile(filename):
    try:
        file=open(filename,'r')
        res=file.read()
        file.close()
        return res
    except:
        print 'Trouble reading: '+filename
        return None
def storeTextFile(filename,txt):
    try:
        file=open(filename,'w')
        file.write(txt)
        file.close()
    except:
        print 'Trouble writing to: '+filename
T=getTextFile("mytext.txt")
print T

Vi lagrer denne fila og ber om å få kjørt den, vi er fortsatt i det vinduet som viser vår modul, Run / Run Module. Dette fører til at Idle blir restartet og melder følgende:

>>> ================================ RESTART ================================
>>> 
dette er text
>>>  

der altså "dette er en text" er innholdet i fila vi leser.

Enkel testing

Modulen Pythontesting inneholder materiale om testing av Pythonkode. Her skal vi bare peke på en enkel mekanisme som gjøre at vi kan kjøre en module i forskjellige modi, hvorav den ene kan brukes til rudimentær testing.

Anta at vi ønsker å bruke vår util-modul i en annen modul som vi kaller versaler. Det eneste den skal gjøre er å lese en fil, lage store bokstaver (versaler) av teksten og skrive resultatet til en (annen) fil. Vi lagrer denne modulen i samme katalog som util, og kan lage den slik:

"""
 Leser filer,
 endrer teksten til versaler
 og skriver resultatet
"""
import util
def lagVersaler(infil,utfil):
    T=util.getTextFile(infil)
    if T!= None:
        T=T.upper()
        util.storeTextFile(utfil,T)
lagVersaler('mytext.txt','myVtext.txt')

Hvis vi kjører denne modulen, vil vi se at koden i util også kjører. Vi kan endre dette ved å skrive om util slik:

"""
Read / write text files
"""
def getTextFile(filename):
    try:
        file=open(filename,'r')
        res=file.read()
        file.close()
        return res
    except:
        print 'Trouble reading: '+filename
        return None
def storeTextFile(filename,txt):
    try:
        file=open(filename,'w')
        file.write(txt)
        file.close()
    except:
        print 'Trouble writing to: '+filename
# basic testing 
if __name__=="__main__":
    T=getTextFile("mytext.txt")
    print T

if-testen (if __name__=="__main__") sjekker om det er modulen, util, som kjører som main eller om modulen brukes av en annen modul. Dette betyr at vi kan kjøre util direkte for å gjøre enkle funkjsonstester, før vi bruker den fra en annen modul.

Pythonpath

Vi kan fortelle operativsystemet hvor vi akter å plassere våre Pythonmoduler. Dersom vi gjør dette, kan vi referere modulene direkte ved navn. På samme måte som Java har sin classpath, har Python sin pythonpath. Måten å sette dem opp på er helt parallelle. Jeg åpner Settings/Controlpanel og starter System. Her velger jeg Advanced og klikker på knappen: Environment Variables. Så leter jeg etter PYTHONPATH i lista med overskriften System variables. Hvis den finnes så ber jeg om å få editere (EDIT) den. Hvis den ikke finnes så lager jeg ny (NEW).

På min maskin ser det i øyeblikket slik ut:

pypathwin

Jeg har alle mine Pythonmoduler samlet i en katalog: c:\articles\ml\pykode

Syntaksen i pathlista er slik at alle pather er adskilt med ; Husk at . representerer pather som er satt andre steder. Ta alltid med . - pathen, dersom du er i tvil.

Dersom dette er gjort kan vi f.eks. importere vår util1.py module som vi laget ovenfor direkte i Idle.

>>> import util1
>>> print util1.getTextFile('c:\\test\\mytext.txt') 

dersom util1 ligger i samme katalog som den modulen som etetrspør den, trenger vi ikke pythonpath for å finne fram.

Pass på navnelikhet: Dersom du baserer deg på pythonpath og du har moduler med samme navn i ulike kataloger, kan du få tak i feil modul.

Fra kommandolinja

Dersom stien til Python katalogen er satt i PATH, kan du kjøre Python direkte fra kommandolinja. Se: Python Windows FAQ [2]

Andre editorer

Det finnes en rekke editorer som handterer Pythonsyntaks, og det er fullt mulig å sette opp alternative utviklingsmiljøer til Idle. NotePad++ er helt grei som Pythoneditor. Merk imidlertid at du må være veldig nøye med å holde styr på indentering. Hele blokkstrukturen i Pythonkoden er basert på indentering.

Referanser
  1. Python Swaroop CH www.swaroopch.com/notes/Python 14-08-2011
  1. Python Windows FAQ Python www.python.org/doc/faq/windows/ 14-03-2009
Vedlikehold

B. Stenseth, revidert juli 2009

( Velkommen ) Python >Utvikling ( Datastrukturer )