Göm menyn

Bibliotek

Ofta när man programmerar stöter man på ett stort problem som eller som man inte vill lösa själv men man misstänker att någon annan redan har löst. I många fall kan man då hitta ett externt bibliotek och använda det istället för att skriva koden själv.

Moduler, datastrukturer, klasser och funktioner

En modul är en grupp av funktioner och klasser (används i kursen) som tillsammans löser specifika uppgifter. Alla externa bibliotek är uppdelade i minst en modul, och om man vill dela upp sin python-kod i flera filer delas den också upp i moduler.

Funktioner i en modul körs genom att skriva module_name.function_name(...). Detta har fördelen att två moduler som tolkar data kan definiera funktioner med samma namn och fortfarande användas tillsammans. Om man importerar modulen med from module_name import function_name... behöver man inte skriva modulnamnet vid anrop till function_name

Import

För att utnyttja funktioner från andra bibliotek eller filer i python används nyckelordet import.

Det vanligaste sättet att använda import är att skriva import library vilket importerar modulen library.

I vissa fall har biblioteket ett långt och jobbigt namn som man inte vill skriva varje gång man ska använda funktioner i biblioteket. Det finns då två andra sätt att importera koden.

Man kan skriva import library as lb där lb är ett annat namn man vill ha på biblioteket. Om man importerat biblioteket så kan man skriva lb.function(...) för att anropa function.

I vissa fall vill man bara använda några enstaka funktioner i biblioteket och då kan man använda from library import function, function2, .... Med den typen av import kan man kalla på function och function2 utan något library innan.

Vad bör man använda

Eftersom det finns tre olika sätt att importera bibliotek kan det vara svårt att veta vilket av dem man ska använda. Oftast är det tydligast att bara använda import eftersom det då är helt uppenbart var funktioner kommer ifrån för någon som läser koden.

Om många funktioner i ett bibliotek används väldigt ofta kan det vara en idé att importera den med ett kortare namn. Biblioteket numpy brukar till exempel importeras som np. Detta har dock nackdelen att det blir lite otydligare vad np faktiskt är så det bör inte göras för ofta.

Till slut, om man har ett bibliotek där man bara använder några enstaka funktioner väldigt ofta så kan det vara lika bra att använda from x import y. Det bör dock inte göras om man använder många funktioner eftersom det då blir mycket svårare att se att en funktion kommer från ett externt bibliotek.

from x import *

En specialfunktion med from x import-syntaxen är att man kan importera alla funktioner ur ett bibliotek genom att skriva from x import *. Detta bör man dock undvika eftersom man inte har koll på alla funktioner i biblioteket och kan råka 'överskrida' funktioner från andra imports eller från sin egen kod.

Se följande exempel för att se varför:

equation.py

def parse(data):
    """Parses data as an equation"""
    ...

natural_language.py

def synonym(word):
    """Returns a synonym to `word`"""
    ...

def parse(sentence, language):
    """Returns the meaning of sentence in language"""

main.py

from equation import parse

# Will "shadow" the parse function from the equation module
from natural_language import *

# What we actually want to use the natural language module for
def get_synonyms():
    ...

def calculate_equation():
    eq=input()
    parse(eq) # Will return an error because we call the wrong parse function

Språkfunktioner, standardbibliotek och externa bibliotek

De flesta programmeringsspråken som finns, inklusive python, är uppdelade i en liten språkkärna, ett större standardbibliotek och flera externa bibliotek som inte skapas av språkskaparna.

Språkkärnan

I pythons språkkärna finns de vanligaste funktionerna som används, till exempel map och print och datastrukturer som list, string och dictionary.

Dessa funktioner brukar kallas inbyggda (eng. built-in) och behöver inte importeras med import. De går att använda direkt.

Standardbiblioteket

Standardbiblioteket innehåller många fler funktioner och datastrukturer som ofta gör mer specifika eller nichade saker än de inbyggda funktionerna. Här finns funktioner för att behandla datum och tid, matematikfunktioner, filhantering med mera. Eftersom många projekt inte behöver använda alla funktionerna måste modulerna importeras med import. En lista och dokumentation för alla moduler som ingår i standardbiblioteket kan hittas här: https://docs.python.org/3/library/index.html

När man söker efter dokumentation om pytons standardbibliotek kan man ibland hamna på sidorna för python 2 istället för 3. Dokumentationen för python 2 har ofta en blå sidebar istället för vit och om man inser att man hittat en sådan sida kan man byta /2/ i URL:en till /3/.

Externa bibliotek

Externa bibliotek är skrivna av andra utvecklare och utför ofta mer avancerade och specifika uppgifter än de moduler som finns i standardbiblioteket. I kursen kommer vi till exempel att använda biblioteket OpenCV som används för bildbehandling av olika slag. Det skrevs från början av Intel och underhålls nu av en egen organisation.

Att installera externa bibliotek

Som namnet antyder så följer externa bibliotek inte med i en pythoninstallation utan de måste installeras separat.

Pip

Det enklaste sättet att installera ett externt bibliotek är att använda verktyget pip som brukar följa med python-installationer. Pip hämtar och installerar bibliotek från en central källa och ser till att paketen går att importera med python.

Paketen som installeras med pip kommer ifrån python package index (pypi) https://pypi.python.org/pypi.

Om man är intresserad av att installera ett paket och inte vet om det finns i pypi brukar man kunna söka på biblioteksnamnet pip och få instruktioner för hur man installerar det.

Kompilera själv

Tyvärr finns inte alla paket i pypi och då kan man behöva kompilera och installera paketet själv. OpenCV har till exempel inte någon officiell version i pypi och den versionen som finns saknar mycket funktionalitet.

Instruktionerna för att kompilera paket manuellt brukar skilja sig mellan olika bibliotek, men ofta är det inte svårare än att hämta koden och köra python3 setup.py.

Import och projekt med fler filer

Vi har sett hur import används för att importera delar av externa bibliotek, men det används även för att importera kod som finns i andra filer i samma projekt. Att dela upp projekt i mindre filer eller moduler är en väldigt bra idé när koden blir större än några enstaka funktioner. Det låter en separera delar av koden som gör olika saker och gör det lättare att hitta de funktioner man letar efter.

Filer

Det enklaste sättet att dela upp koden är att bara ha olika filer. För att importera kod från en annan fil anvädner man import <modulnamn> där modulnamnet är filnamnet utan .py. Precis som med bibliotek läggs de nya funktionerna i en egen modul och man måste skriva modulnamn.function() för att använda dem.

Undermappar

Ibland vill man även dela upp koden i undermappar vilket är lite mer komplext. För att python ska känna igen en mapp som en projektmapp måste det finnas en fil som heter __init__.py i mappen. Denna fil kan vara tom. För att importera en fil från en mapp används import mappnamn.modulnamn och för att anropa en funktion i filen används mappnamn.modulnamn.function().

Virtualenv

Ibland använder man en dator som man inte har administratörsrättigheter på, till exempel datorerna på universitetet. Då kan det vara svårt att installera paket eftersom de oftast vill bli installerade på systemnivå. Ett sätt att komma runt det och installera paketen lokalt är med verktyget virutalenv.

Virtualenv skapar en virtuell pythonmiljö där paket kan installeras utan att påverka resten av systemet. Det gör också att man kan ha flera olika versioner av samma bibliotek i olika projekt.

Du kan läsa mer om virtualenv här: https://virtualenv.pypa.io/en/stable/.


Sidansvarig: Peter Dalenius
Senast uppdaterad: 2021-12-03