Lukeminen
MistÀ on kyse?
Aloitetaan jo olemassa olevien skriptien lukemisesta. Aiemmissa luvuissa tutustuimme Bash ja PowerShell asennusskripteihin. Python ei ole Shell, joten on hieman harvinaisempaa, ettÀ asennusskripti on kirjoitettu Pythonilla. Sen sijaan me pengomme /usr/bin-hakemistossa sijaitsevia Python-skriptejÀ.
Skriptien louhiminen
Louhinta
Alla on skripti, jolla voit kopioida kaikki Python-skriptit virtuaalikoneesta. Skripti noutaa kaikki virtuaalikoneen skriptit ja kopioi ne hakemistoon $REPO/python/ubuntu_python/. TÀmÀn sinÀ toki jo tiedÀt, koska osaat tulkita aiempien lukujen oppien avulla skriptin sisÀllön. TÀmÀn luvun ensimmÀinen tehtÀvÀ on luoda ja ajaa tÀmÀ skripti. Tarkempi tehtÀvÀnanto on alempana otsikon TehtÀvÀt alla.
#!/bin/bash
# Usage: getscripts.sh [language]
language=${1:-python}
dirname="ubuntu_$language"
vm_name="copycat"
# Create new virtual machine using multipass
multipass launch --name $vm_name lts
# List all scripts in the system
declare -a scripts
IFS=$'\n' read -d '' -r -a scripts < <(
multipass exec "$vm_name" -- find /usr/bin -type f -exec file {} \+ | awk -F: -v lang="${language}" 'tolower($2) ~ lang {print $1}'
)
# Copy all files
for script in "${scripts[@]}"; do
multipass transfer --parents ${vm_name}:$script ./$dirname/
echo "Copied $script"
done
# Kill the virtual machine
multipass delete $vm_name
multipass purge
Tip
Jos haluat hakea Perl-skriptit, aja sama komento argumentilla perl. Ne kopioidaan hakemistoon $REPO/perl/ubuntu_perl/. Et tarvitse Perl-skriptejÀ tÀllÀ kurssilla, mutta voit tutustua niihin ihan yleisen mielenkiinnon ja sivistyksen vuoksi.
Katsaus
Kun olet ajanut skriptin, sinulla on hakemisto, jossa on kaikki Python-skriptit. Seuraavaksi valitset kolme skriptiÀ, joita tulet lukemaan. Valitse skriptit, jotka ovat tarpeeksi pitkiÀ ja monimutkaisia, jotta niiden lukeminen on mielekÀstÀ. Alla on listaus helmikuussa 2025 Ubuntu 24.04:stÀ löytyneistÀ skripteistÀ lyhyine kuvauksineen ja pituuksineen.
Alla taulukossa vain ne, joiden pituus on yli 100. Loput löytyvÀt admonitionin alta.
| Name | Lines | Purpose |
|---|---|---|
| unattended-upgrade | 2522 | Automates system package upgrades for security and stability. |
| pygettext3.12 | 681 | Extracts translatable strings from Python source files. |
| ubuntu-security-status | 579 | Reports security status of installed Ubuntu packages. |
| networkd-dispatcher | 547 | Dispatches network status changes to scripts. |
| pastebinit | 474 | Uploads text to pastebin services from the command line. |
| add-apt-repository | 452 | Manages PPAs and other APT repositories. |
| apport-cli | 419 | Command-line interface for Ubuntu's crash reporting tool. |
| rrsync | 379 | Restricted wrapper for rsync. |
| hwe-support-status | 369 | Checks Ubuntu Hardware Enablement (HWE) support status. |
| py3compile | 323 | Compiles Python 3 files to bytecode. |
| oem-getlogs | 307 | Collects system logs for OEM support. |
| ec2metadata | 283 | Retrieves instance metadata on AWS EC2. |
| do-release-upgrade | 260 | Upgrades Ubuntu to a newer release. |
| py3clean | 210 | Removes Python 3 bytecode files. |
| apport-unpack | 111 | Extracts crash reports for debugging. |
| jsonpatch | 107 | Applies JSON patches to JSON documents. |
< 100 pitkÀt
| Name | Lines | Purpose |
|---|---|---|
| jsonpointer | 69 | Resolves JSON Pointer references. |
| routel | 62 | Displays routing table information. |
| json-patch-jsondiff | 39 | Generates and applies JSON patches. |
| sosreport | 35 | Collects system diagnostic information. |
| sos-collector | 35 | Collects sosreports from multiple systems. |
| ubuntu-advantage | 33 | Manages Ubuntu Advantage cloud services. |
| ssh-import-id | 33 | Imports SSH public keys from Launchpad/GitHub. |
| pyserial-ports | 33 | Lists available serial ports. |
| pyserial-miniterm | 33 | Simple terminal for serial communication. |
| pybabel-python3 | 33 | Manages translations in Python projects. |
| netaddr | 33 | Provides network address manipulation utilities. |
| cloud-init | 33 | Initializes cloud instances at boot. |
| cloud-id | 33 | Identifies cloud instance metadata. |
| automat-visualize3 | 33 | Visualizes state machines from Automat library. |
| landscape-sysinfo | 26 | Displays system information summary. |
| sos | 25 | Command-line tool for gathering system information. |
| twistd3 | 8 | Runs Twisted-based applications as daemons. |
| twist3 | 8 | Twisted framework helper script. |
| trial3 | 8 | Runs unit tests for Twisted applications. |
| tkconch3 | 8 | SSH client using Twisted Conch. |
| pyhtmlizer3 | 8 | Converts Python source code to HTML. |
| pygmentize | 8 | Highlights syntax of source code. |
| markdown-it | 8 | Processes Markdown with markdown-it library. |
| mailmail3 | 8 | Sends email using the mailmail utility. |
| jsonschema | 8 | Validates JSON data against schemas. |
| conch3 | 8 | Twisted Conch SSH framework utility. |
| ckeygen3 | 8 | Generates SSH keys using Twisted Conch. |
| chardetect | 8 | Detects character encoding of text files. |
| cftp3 | 8 | FTP client using Twisted Conch. |
| pydoc3.12 | 5 | Displays Python documentation in a pager or web browser. |
Kuinka lista tehtiin?
Lista on alustettu komennolla:
Kokeile ihmeessÀ komentoa omassa hakemistossasi! Komennon tuloste on syötetty ChatGPT 4o -mallille, jota on pyydetty tÀydentÀmÀÀn kunkin skriptin purpose. Huomaa, ettÀ ChatGPT voi olla vÀÀrÀssÀ! Kun valitset omat kolme skriptiÀsi, tarkista niiden osalta, ettei ChatGPT ole antanut virheellistÀ tietoa.
TĂ€rpit
TÀmÀn luvun toinen tehtÀvÀ on tutustua Python-skripteihin, jotka kopioit virtuaalikoneesta host-koneellesi. Osa skripteistÀ voi olla hieman vaikea lÀhestyÀ, jos et ole Pythonin kanssa ennen työskennellyt. TÀmÀn otsikon alaotsikoissa kÀsitellÀÀn muutamat vinkit, joiden avulla voit paremmin ymmÀrtÀÀ skriptien toimintaa.
Sisennys
Toisin kuin Bash ja PowerShell, Python kÀyttÀÀ sisennystÀ (engl. indentation) koodin rakenteen mÀÀrittÀmiseen. Aiempien kielten skripteissÀ olet nÀhnyt sisennystÀ kÀytettÀvÀn, mutta syynÀ on pelkkÀ luettavuuden parantaminen. Pythonissa sisennys vaikuttaa toiminnallisuuteen. Sivuoireena Pythonissa koodiblokin ympÀrille ei tarvitse laittaa sulkeita esimerkiksi if-lausekkeissa.
Esimerkiksi:
if True:
print("<= Huomaa sisennys. TÀmÀ toimii!")
if True:
print("<= Huomaa puuttuva sisennys. TÀmÀ nostaa IndentationError-virheen!")
Vertaa tÀtÀ PowerShellin syntaksin kanssa:
Tip
Sisennys voi olla esimerkiksi 2 vÀlilyöntiÀ, 4 vÀlilyöntiÀ tai tabulaattori. Pythonin PEP 8 -ohjeistus suosittelee 4 vÀlilyönnin kÀyttöÀ. MinkÀ ikinÀ valitsetkin, pidÀ se koko skriptin (tai projektin) ajan samana.
PuolipistettÀ voi kÀyttÀÀ Pythonissa erottamaan monta komentoa toisistaan, mutta se ei ole konvention mukaista.
Toimimattomat importit
Jos parsit Python-skriptiÀ lokaalilla koneella, joka ei ole Ubuntu, huomannet, ettÀ VS Code varoittaa joidenkin importtien olevan toimimattomia.
Kuva 1: VS Code:n Pylance varoittaa keltaisella alleviivauksella, ettÀ jsonpatch-moduuli on toimimaton. Kuvakaappaus on otettu macOS-koneelta, jossa ei ole kyseistÀ moduulia. Parsittava tiedosto on jsonpatch.
NÀmÀ toimimattomat importit liittyvÀt Debian-pohjaisen Ubuntun tapaan kÀyttÀÀ suurta mÀÀrÀÀ esiasennettuja moduuleita. Moduulit löytyvÀt hakekistosta: /usr/lib/python3/dist-packages/. YllÀ olevan esimerkin (ks. Kuva 1) epÀtoimiva import jsonpatch ei suinkaan ole kyseinen tiedosto itse, vaikka kyseinen tiedosto sattuu olemaan nimeltÀÀn sama. KyseessÀ on jsonpatch-niminen kirjasto. Useimmat kirjastot löytyvÀt PyPi:stÀ eli Python Package IndexistÀ. NÀinpÀ esimerkiksi jsonpatch:n dokumentaatio löytyy osoitteesta: https://pypi.org/project/jsonpatch/.
Multipass
YllÀ esitelty skripti luo virtuaalikoneen nimeltÀÀn copycat. Voit hyödyntÀÀ vastaavia komentoja luomaan sinulle oman koneen, jonka sisÀllÀ voit harjoitella interaktiivisia komentoja. Esimerkiksi:
# Luo kone SKR(ipti)OH(jelmointi)
multipass launch --name skroh lts
# NÀet koneen tiedot nÀin (esim. ip-osoite)
multipass info skroh
# Avaa koneen terminaali
multipass shell skroh
# Poista kone
multipass delete skroh
# Poista jÀÀnteet
multipass purge
Skriptin koeajo
Skriptin ajaminen voi hyvin antaa konkretiaa siihen, mitÀ skripti oikeastaan tekee. Olettaen ettÀ olet Multipassilla luodun virtuaalikoneen sisÀllÀ, skriptien ajaminen on turvallista. SiispÀ kannattaa kokeilla, saatko esimerkiksi ChatGTP:n ja dokumentaation avulla skriptin tavalla tai toisella kÀyttöön!
Esimerkiksi skripti /usr/bin/twist3 muuttuu paljon konkreettisemmaksi, kun kokeilet ajaa sitÀ. Alla on komennot, joilla Twisted-webbiserveri kÀynnistetÀÀn. Web-palvelimen lisÀksi Twisted osaa myös DNS, FPT ja muita protokollia. Web-serveri on kuitenkin nopea testata, koska tarvitsemme vain index.html-tiedoston johonkin hakemistoon. Luodaan se ~/www.
$ cd
$ mkdir www
$ echo 'Hello, world!' > www/index.html
$ /usr/bin/twist3 web --path=www
2025-02-24T10:16:43+0200 [-] Site starting on 8080
2025-02-24T10:16:43+0200 [twisted.web.server.Site#info] Starting factory <twisted.web.server.Site object at 0xea8a0140fad0>
2025-02-24T10:16:43+0200 [twisted.application.runner._runner.Runner#info] Starting reactor...
Tip
Tyypillinen kielimalli osaisi tarjota sinulle nĂ€mĂ€ komennot, jos minĂ€ en niitĂ€ tarjoaisi. KĂ€ytĂ€ tekoĂ€lyĂ€ apuopettajanasi! đ€
Nyt voit avata selaimen ja mennÀ osoitteeseen http://<multipass-vm-ip>:8080. Saat ip-osoitteen selville yllÀ esitellyllÀ multipass info-komennolla.
Kuva 2: Twisted www-palvelimen tarjoilema index.html-tiedosto nÀkyy host-koneen selaimessa.
Note
Huomaa, ettÀ twist3 ja twistd3 ovat eri skriptit. JÀlkimmÀisen d tulee sanasta daemon, joka tarkoittaa taustaprosessia. Jos ajat saman komennon sitÀ vasten, syntynyt prosessi ei jÀÀ shelliin. LöydÀt sen prosessilistalta komennolla ps aux | grep twist ja voit tappaa sen komennolla kill <pid>.
TehtÀvÀt
TehtÀvÀ: Python DevausympÀristö
EnsimmÀisenÀ tehtÀvÀnÀ luot itsellesi devausympÀristön. KÀytÀnnössÀ luot:
- Hakemistorakenteen tehtÀvien vastauksia varten
- Skriptin
getscripts.sh, joka:- SisÀltÀÀ yllÀ esitellyn koodin, ja tÀten...
- KÀynnistÀÀ multipass-virtuaalikoneen nimeltÀÀn
copycatđ± - Kopioi skriptit sinun lokaalille koneelle
ubuntu_python/-hakemistoon - Tuhoaa virtuaalikoneen
- Valitset ja sÀilytÀt n kappaletta Python-skriptejÀ, joita tulet lukemaan
- Saat tuhota loput skriptit
- Varmistat, ettÀ kaikki tarpeellinen on versionhallinnassa
On oletus, ettÀ työskentelet yhÀ samassa hakemistossa ja repositoriossa, missÀ Bash ja PowerShell-osiotkin on tehty. Esimerkiksi:
đ§ linux: /home/uname/Code/skriptiohjelmointi-2054/johnanderton
Luo repositorion sisÀlle uusi python/-hakemisto ja sen sisÀlle sekÀ yllÀ mainittu skripti ettÀ hakemisto skriptejÀ varten. Repositoriosi rakenteen tulisi olla seuraavaa myötÀilevÀ:
johnanderton
âââ README.md
âââ bash
â âââ .gitkeep
âââ pwsh
â âââ .gitkeep
âââ python
âââ README.md
âââ getscripts.sh
âââ scripts
âââ kaikki.py
âââ skriptit.py
âââ tanne.py
Tiedosto getscripts.sh:n sisÀltö on esitelty yllÀ. Luo ja aja se.
TehtÀvÀ: Parsi Python-skriptit
Tee sama kuin teit Bashin ja PowerShellin vastaavassa tehtÀvÀssÀ. Erona on se, ettÀ skriptit eivÀt ole tÀllÀ kertaa netistÀ löytyviÀ (tai löytyisi ne sieltÀkin), vaan skriptit on louhittu virtuaalikoneen sisÀltÀ. Muista, ettÀ sinun ei tarvitse ymmÀrtÀÀ syvÀllisesti aivan jokaisen rivin toimintaa. Tutustu skriptiin ja sen syntaksiin pinnallisesti. Tutki, kuinka skripti on rakennettu ja mitÀ se tekee yleisellÀ tasolla, ja mistÀ konkreettisista palasista (esim. if) se koostuu.
Vaiheet:
- Tee yllÀ oleva tehtÀvÀ, jotta
ubuntu_python/-hakemistossa on skriptit - Valitse kolme skriptiÀ.
- ĂlĂ€ valitse liian lyhyitĂ€.
- Voit tuhota loput skriptit.
- Aloita tiedoston ylhÀÀltÀ ja prosessoi se rivi riviltÀ.
Tee seuraavat toimenpiteet jokaiselle skriptille:
- â Jos koodirivi sisĂ€ltÀÀ entuudestaan vierasta syntaksia: dokumentoi se. đ
- đ Jos koodirivin syntaksi on jo esiintynyt aiemmin scriptissĂ€: unohda rivi. đ«ł
- (Optional: TÀmÀn jÀlkeen poista kyseinen koodirivi tiedostosta.)
TÀmÀn pitÀisi olla sinulle jo entuudestaan tuttua.
AjansÀÀtöÀ tekoĂ€lyllĂ€! đ€
TĂ€mĂ€n pitĂ€isi olla sinulle aiemmista luvuista tuttu ohje! On suorastaan suositeltua kĂ€yttÀÀ tekoĂ€lyĂ€ apuna selittĂ€mÀÀn, mitĂ€ kyseiset Powershell-kielen entuudestaan tuntemattomat koodirimpsut tekevĂ€t. ĂlĂ€ ulkoista omia aivojasi, vaan kĂ€ytĂ€ tekoĂ€lyĂ€ apuna!

