Pakkaus on moduulien kokonaisuus. Pakkaus luodaan tekemällä hakemisto, johon lisätään __init__.py-niminen tiedosto. Tiedosto voi olla tyhjä. Tähän pakkaushakemistoon tulevat sen sisältämät moduulitiedostot ja alapakkaukset.

  • 📁 pakkaus
    • 📃 moduuli
    • 📁 alapakkaus
      • 📃 toinen_moduuli
    • 📃 kolmas_moduuli

Pakkauksessa oleva moduuli tuodaan sovellukseen import-lauseella pakkaus.moduuli muodossa.

import pakkaus.moduuli
import pakkaus.alapakkaus.toinen_moduuli

Jos moduulia ei haluta aina käyttää pakkauksen nimen kanssa voi moduulin nimen tuoda pakkauksesta from-avainsanalla.

from pakkaus import moduuli
from pakkaus.alapakkaus import toinen_moduuli

Tai sille voi sille antaa lyhyen nimen as-sanalla.

import pakkaus.moduuli as mod1
import pakkaus.alapakkaus.toinen_moduuli as mod2

Pythonissa on myös toisenlaisia pakkauksia, nimiavaruuspakkauksia, joihin ei tule __init__.py-tiedostoa eikä niillä välttämättä tarvitse olla hakemistoakaan.

__init.py__ muokkaa

Tiedosto __init__.py suoritetaan, kun pakkaus tuodaan ohjelmaan (importataan). Tiedosto voi olla tyhjä. Jos pakkaus on esimerkiksi jaettu alamoduuleiksi ja pakkauksiksi, voi __init__.py-tiedostossa osat eksportata uudestaan siten, että ulospäin pakkaus näyttää yhdeltä.

Suoritettava pakkaus muokkaa

Pakkauksesta voi tehdä suoritettavan kirjoittamalla sen suoritettava koodi __main__.py-nimiseen tiedostoon, joka sijoitetaan pakkauksen hakemistoon. Hakemistolla pitää myös olla __init__.py-tiedosto.

  • 📁 omaprojekti
    • 📁 pakkaus
      • 📃 __init__.py
      • 📃 __main__.py

Sen jälkeen ohjelman voi suorittaa seuraavasti.

$ python -m pakkaus

Projektin pakkaaminen muokkaa

Useita tiedostoja sisältävät projektit kannattaa aina tehdä pakkauksiksi. Tämä tekee moduulien importtaamisesta helpompaa. Projektin päähakemistoon sijoitetaan alihakemisto, joka on projektin pääpakkaus. Siihen tehdään, mahdolisesti tyhjä, __init__.py-tiedosto sekä __main__.py-tiedosto, johon tulee käynnistyskoodi.

Alamoduulit voi sitten importata __main__-moduuliin suhteellisilla viittauksilla

from . import alapakkaus
from .alapakkaus import alamoduuli

Kolmansien osapuolten pakkaukset muokkaa

Kolmannen osapuolen pakkauksia voi asentaa pakkausten hallintasovelluksilla. Näitä on useita mm. pip. Pipin voi asentaa erillisenä sovelluksena tai sitä voi käyttää python-tulkin kautta.

$ python -m pip install pakkauksen_nimi
# tai
$ pip install pakkauksen_nimi

Pakkaus poistetaan uninstall-komennolla.

$ pip uninstall pakkauksen_nimi

Komento list listaa asennetut pakkaukset ja niiden versiot.

$ pip list

Pakkauksia pitää etsiä muuta kautta, koska haku ei nykyään toimi.

Virtuaaliympäristöt muokkaa

Jos yksi sovellus tarvitsee tietyn version kirjastosta ja toinen toisen, voi avuksi ottaa virtuaaliympäristöt. Virtuaaliympäristöön voi asentaa halutut kirjastot samalla tavalla kuin järjestelmätasolla, mutta kirjastot ovat käytössä vain kyseisessä ympäristössä. Ympäristö kannattaa luoda aina uutta projektia aloittaessa.

Virtuaaliympäristö luodaan ajamalla moduuli venv hakemistossa jonka alihakemistoksi ympäristö halutaan luoda. Projektikohtaisen virtuaaliympäristön voi sijoittaa projektin alahakemistoksi, mutta virtuaaliympäristöjen ei välttämättä tarvitse olla projektikohtaisia. Esim. Bashissa

~/projektit/omaprojekti$ python -m venv ympäristö
~/projektit/omaprojekti$ ls
ympäristö

Komento luo hakemiston, jolla on annettu ympäristön nimi, ja siihen seuraavan hakemistorakenteen:

  • 📁 ympäristö
    • 📁 bin
      • 📃 activate
      • 📃 pip
      • 📃 python
      • ...
    • 📁 include
    • 📁 lib
    • 📁 lib64
    • 📃 pyvenv.cfg
    • 📁 share

Hakemistossa bin on skripti activate-nimisiä skriptejä eri komentotulkeille, joilla ympäristön voi aktivoida. Aktiivisen ympäristön nimi ilmestyy komentokehotteen alkuun suluissa.

~/projektit/omaprojekti$ . ympäristö/bin/activate
(ympäristö) ~/projektit/omaprojekti$

Nyt pipillä asennettavat paketit asentuvat vain projektin ympäristöön.

Vaihtoehtoisesti voi käyttää bin-hakemistossa olevia versioita pipistä ja python-tulkista.

Ympäristön sisällä ollessa python ja pip ovat bin-ympäristön hakemistosta, kuten seuraavasta nähdään.

(ympäristö) ~/projektit/omaprojekti$ which python
/home/esimerkki/projektit/omaprojekti/ympäristö/bin/python
(ympäristö) ~/projektit/omaprojekti$ which pip
/home/esimerkki/projektit/omaprojekti/ympäristö/bin/pip

Ympäristöstä pääsee ulos deactivate-komennolla.

(ympäristö) ~/projektit/omaprojekti$ deactivate
~/projektit/omaprojekti$

Hakemistoissa lib ja lib64 on alahakemisto nimeltä python<versionumero>, jonka alla on hakemisto site-packages. Pipillä asennettavat pakkaukset asentuvat tähän hakemistoon.

Virtuaaliympäristön voi tehdä projektin alihakemistoksi tai se voi sijaita muualla. Tässä projektilla on oma virtuaaliympäristö alihakemistossa venv.

  • 📁 omaprojekti
    • 📁 pääpakkaus
      • 📃 __init__.py
      • 📃 __main__.py
      • 📁 alapakkaus
        • 📃 alamoduuli.py
    • 📁 venv
      • ...

Projektin riippuvuudet muokkaa

Kun projekti jaetaan toisille käyttäjille, pitää heillä olla kaikki projektin käyttämät kirjastot asennettuna. Jos projektille on luotu virtuaaliympäistö, voidaan ympäristöön asennetut pakkaukset tallentaa tiedostoon pipin freeze-komennolla. Riippuvuudet sisältävä tiedosto on tapana nimetä requirements.txt-nimiseksi ja tallentaa projektin juureen.

(ympäristö) ~/projektit/omaprojekti$ pip freeze > requirements.txt

Tiedostosta saadaan sitten kaikki projektin vaatimat pakkaukset asennettua helposti seuraavasti.

(ympäristö) ~/projektit/omaprojekti$ pip install -r requirements.txt