0%

Genoeg van de opdrachtregel · oefening

Voer je eigen programma uit

Voor deze les is het hoofdstuk opgebouwd.

python is een programma zoals elk ander. De terminal voert het net als andere programma’s uit: op naam. Geef het een bestandsnaam en het voert dat bestand uit:

python report.py
You have read 3 books.
- The Left Hand of Darkness
- Piranesi
- Station Eleven

Dat is de report.py in je project, die ls je sinds de tweede les laat zien. Je hoefde het bestand niet eerst naar een andere uitvoeromgeving te kopiëren of in te dienen. De shell startte Python en gaf report.py mee als argument. Python opende dat bestand relatief aan de werkmap en voerde de broncode uit.

Waar de bestandsnaam wordt opgezocht

report.py is een relatief pad en wordt dus vanuit de werkmap gevonden, volgens dezelfde regel als bij ls en cat. Sta je in data en typ je python report.py, dan meldt Python dat het het bestand niet kan vinden. Vanaf daar kan dat ook niet.

Dit is een van de meest voorkomende redenen waarom een eerste script niet start. Het probleem zit niet in het Python-bestand.

Uitvoer ergens anders naartoe sturen dan het scherm

Standaard gaat de uitvoer van een programma naar je terminal. > stuurt die in plaats daarvan naar een bestand. We zetten het in de map notes die je in de vorige les maakte:

python report.py > notes/summary.txt

Controleer met ls of notes er werkelijk staat. Zo niet, dan heb je de vorige les overgeslagen of het project gereset. Met mkdir notes maak je de map weer.

Voordat je die omleiding uitvoert is één ding over mappen nuttig om te weten. Het verklaart de meeste verwarrende resultaten bij deze stap.

> maakt het bestand waarnaar het wijst, maar nooit een map om het in te zetten. Leid je de uitvoer om naar een map die niet bestaat, dan stopt de shell met No such file or directory en noemt het pad dat niet geopend kon worden. Die melding gaat over de map, niet over je programma.

Er verschijnt niets op het scherm als de omleiding werkt, en dat klopt: de uitvoer ging naar het bestand. cat notes/summary.txt laat zien dat die is aangekomen.

Het werkt met elke opdracht, niet alleen Python. echo toont eenvoudigweg wat je opgeeft. Dat maakt het de kortste manier om de omleiding op zichzelf te bekijken:

echo hello > /tmp/pip-redirect-demo.txt
cat /tmp/pip-redirect-demo.txt

Nog twee dingen over > voordat je erop gaat vertrouwen. Het maakt het bestand als dat niet bestaat en vervangt zonder te vragen de inhoud als het wel bestaat. Bovendien doet de shell dit, niet Python: je programma toont nog steeds gewoon tekst en de shell bepaalt waar die terechtkomt. Door die scheiding werkt dezelfde omleiding met veel opdrachten.

Een bestand bewerken zonder de terminal te verlaten

Om report.py te veranderen heb je een editor nodig. De Python Land-terminal bevat er een. nano opent een bestand om het te bewerken op de plek waar je staat:

nano report.py

Het bestand vult het scherm. Met de pijltjestoetsen kun je erdoorheen bewegen. Onderaan toont nano de opdrachten; ^ betekent de Control-toets:

  • Ctrl + O schrijft het bestand weg. Je wordt gevraagd de naam te bevestigen; druk op Enter.

  • Ctrl + X verlaat nano en geeft je de prompt terug.

Sla op en sluit daarna af. Die twee handelingen zijn alles wat je vandaag nodig hebt.

nano is niet de editor die je voor het echte werk gaat gebruiken. Hoofdstuk 4 installeert er een die dat wel is. Deze editor staat hier omdat je ooit een bestand via een terminal moet kunnen bewerken op een computer die niets anders heeft, en omdat dit de kortste weg is van “ik kan bestanden bekijken” naar “ik kan ze veranderen”.

Nu jij

  1. Voer ls uit. Zie je geen notes, voer dan mkdir notes uit.

  2. Open report.py met nano en voeg "The Dispossessed" toe aan de lijst books. Sla op met Ctrl + O en sluit daarna af met Ctrl + X.

  3. Voer python report.py uit en controleer of de uitvoer vier boeken noemt en jouw toevoeging toont.

  4. Voer het nogmaals uit en stuur de uitvoer naar notes/summary.txt.

  5. Gebruik cat notes/summary.txt om te controleren of die is aangekomen.

Druk daarna op Check my work. Doe dat na stap 5, niet na stap 1. Zolang het bestand niet bestaat, is er niets opgeslagen dat de beoordeling kan vinden.

Toont stap 3 nog drie boeken, bekijk dan cat report.py: bevat de opgeslagen lijst books alle vier de titels? Controleer de toegevoegde titel en sla op met Ctrl + O, gevolgd door Enter. Ziet het opgeslagen bestand er goed uit, controleer dan met pwd of je de bedoelde projectkopie uitvoert. Python leest het bronbestand bij elke aanroep opnieuw.

Meldt stap 4 No such file or directory, lees dan welk pad wordt genoemd. Bash noemt notes/summary.txt; een ontbrekende map notes verhindert dat het bestand kan worden gemaakt. Ga terug naar stap 1 en daarna meteen weer naar stap 4.

Je voert python report.py > notes/summary.txt uit en er verschijnt niets op het scherm. Wat is er gebeurd?