Python Balíčky

Programování v GIS 2

Jan Caha

2025-03-30

Modul

  • .py soubor s funkcemi, proměnnými či objekty
  • proměnné modulu obvykle zapisujeme velkými písmeny např. PI či DEFAULT_COLOR
  • např. soubor utils.py ze cvičení (a ukázek na webu)
  • lze používat lokálně
  • stačí na jednoduché použití, pro větší projekty nedostačuje

Balíček

  • složka s python soubory, která obsahuje soubor __init__.py
  • taková složka je Pythonem identifikována jako balíček (jméno složky odpovídá jménu balíčku)
  • může mít i zanořené dílčí balíčky
  • kromě kódu může obsahovat i další soubory (např. data)
  • aby Python balíček našel, musí být v některé z cest v sys.path, ty lze editovat např. skrze systémovou proměnnou PYTHONPATH
conda env config vars set PYTHONPATH=$PYTHONPATH:/path/to/your/package
python3 -c "import sys;print(sys.path);import your_package"

Příklad struktury

my_package/
├── __init__.py
├── module1.py
├── module2.py
└── subpackage/
    ├── __init__.py
    └── submodule.py
└── data/
    └── data_file.csv
    └── data.gpkg

Balíček - komplexnější

  • pokud chceme balíček i s nastavením závislostí, metadatay a testy, chceme obvykle komplexnější strukturu
  • doinstalujeme balík poetry do prostředí conda
  • poetry
    • umožní postavit strukturu balíčku
    • management závislostí
    • instalace

Balíček sestavený pomocí poetry

poetry new nazev_balicku
nazev_balicku/
└── src/
    └── nazev_balicku/
        └── __init__.py
├── tests
    └── __init__.py
├── pyproject.toml
└── README.md

pyproject.toml

  • moderní způsob specifikace nastavení balíčku a nástrojů
  • specifikace metadata balíčku - např. název, verze, autor, závislosti
[project]
name = "balicekpgis2"
version = "0.1.0"
description = ""
authors = [
    {name = "autor",email = "email@email.com"}
]
readme = "README.md"
requires-python = ">=3.12"
dependencies = [
    "numpy (>=2.2.4,<3.0.0)"
]

[tool.poetry]
packages = [{include = "balicekpgis2", from = "src"}]


[build-system]
requires = ["poetry-core>=2.0.0,<3.0.0"]
build-backend = "poetry.core.masonry.api"

Přidání závislostí

  • závislosti - více typů (např. pro spuštění a vývoj)
  • parametr --lock, zabrání instalaci závislostí do virtualního prostředí (venv)
poetry add GDAL --lock
poetry add --group dev pytest black --lock

pyproject.toml úprava přidáním dat k balíčku

  • dvě varianty
[tool.poetry]
include = [
    "src/nazev_balicku/data/*.tif",
    "src/nazev_balicku/data/*.gpkg",
]

[tool.poetry.package-data]
"nazev_balicku.data" = ["*.tif", "*.gpkg"]

Instalace

poetry install 
  • instalace balíku
  • tzv. interaktivní instalace - změny v kódu se projeví se při příštím spuštění Pythonu
  • stejný výsledek dá i příkaz pip install -e .

Sestavení pro instalaci jinde

poetry build
  • vznikne složka dist/ s balíčkem
  • balíček je ve formátu .tar.gz a .whl
  • balíček je možné nahrát na PyPI (Python Package Index) - veřejný repozitář balíčků
  • balíček je možné instalovat z whl souboru pomocí pip install nazev_balicku*.whl

Použití - struktura

─── src/
    └── nazev_balicku/
        └── __init__.py
        └── modul_path.py
        └── modul_gdal.py

Použití - import

from nazev_balicku.modul_path import fn_1 # funkce
from nazev_balicku.modul_path import * # všechny funkce

import nazev_balicku # import celého balíčku
nazev_balicku.modul_path.fn_1() # použití funkce

Použití - úprava __init__.py

  • z dílčích modulů importujeme funkce do __init__.py
  • tím je zpřístupníme i na úrovni balíčku
  • příklad __init__.py
from nazev_balicku.modul_path import *
from nazev_balicku.modul_gdal import *

Použití - po změně import

  • import nazev_balicku - import celého balíčku a věcí z __init__.py
from nazev_balicku import fn_1 # funkce
from nazev_balicku import * # všechny funkce

Závěr

  • balíčky a moduly jsou důležitou součástí Pythonu
  • umožňují strukturovat kód a znovu ho použít
  • umožňují i sdílet kód s ostatními
  • poetry je vhodný nástroj pro správu balíčků a závislostí

Dotazy?