0%

Genoeg van de opdrachtregel

Wanneer de shell nee zegt

Deze twee fouten kom je in je eerste weken met een terminal vaak tegen. Beide zien er alarmerend uit en betekenen iets specifieks dat je kunt oplossen.

“command not found”: opdracht niet gevonden

pythno report.py
bash: pythno: command not found

De shell zocht naar een programma met de naam pythno, vond er geen en stopte. De shell kwam nooit aan jouw bestand toe. report.py in die regel is niet eens bekeken.

Lees de melding letterlijk: die noemt wat niet gevonden kon worden. Bijna altijd is dat een typefout. Soms betekent het dat het programma werkelijk niet is geïnstalleerd. Dat is een onderwerp voor hoofdstuk 4, niet voor dit hoofdstuk.

“No such file or directory”: bestand of map niet gevonden

python data/report.py
python: can't open file '/workspace/data/report.py': [Errno 2] No such file or directory

Deze fout verschilt op een belangrijk punt: de shell vond python zonder problemen en voerde het uit. Python startte, ging op zoek naar het genoemde bestand en kon het niet vinden.

Let erop dat de melding een absoluut pad bevat, /workspace/data/report.py, hoewel je een relatief pad typte. Dat pad is een nuttige aanwijzing: Python vertelt precies waar het zocht. Vergelijk het met pwd om te controleren of je het juiste bestand vanuit de verkeerde map noemde.

Onderscheid startproblemen van exceptions in je code

De eerste fout kwam van Bash: die kon de opdracht niet vinden. De tweede kwam van de Python-interpreter: Bash startte Python, maar Python kon het gevraagde script niet openen. Beide stopten voordat de eerste regel van report.py werd uitgevoerd.

Een exception binnen je programma ziet er anders uit. Python toont een traceback met bestanden en regelnummers, eindigend met het exceptiontype:

Traceback (most recent call last):
  File "/workspace/report.py", line 3, in <module>
    print(f"You have read {len(boks)} books.")
                               ^^^^
NameError: name 'boks' is not defined

Je weet uit Fundamentals I al hoe je die leest. De nieuwe vaardigheid is bepalen welke laag je bekijkt. Bij command not found bekijk je de opdrachtnaam. Bij can't open file bekijk je het scriptpad en de werkmap. Bij deze traceback met NameError bekijk je de genoemde regel in je code.

Maak van “geen traceback” geen algemene regel. Later in deze cursus melden je eigen opdrachtregelprogramma’s sommige verwachte fouten bewust zonder traceback. Hier onderscheiden de opdrachtnaam, het pad en de traceback samen deze drie voorbeelden.

Je voert python reprot.py uit en krijgt can't open file '/workspace/reprot.py': [Errno 2] No such file or directory. Wat ging er mis?

Welke uitspraak vergelijkt de drie fouten uit deze les correct?

Dat is de opdrachtregel, voor zover je die nu nodig hebt. Je kunt opvragen waar je bent, bekijken wat er staat, van plek wisselen, bestanden maken en verplaatsen, je eigen programma’s uitvoeren en de verantwoordelijke laag bij deze veelvoorkomende fouten aanwijzen.

Genoeg is hier het kernwoord. Dit hoofdstuk leerde de opdrachten die je voor Python nodig hebt en stopte daar. Wil je ook de rest van de gereedschapskist, waaronder cp, rm en rmdir, dan heeft Computer Fundamentals daar een hoofdstuk over:

Het volgende hoofdstuk geeft je programma’s een eigen plek.

Weet je bij een foutmelding niet zeker waar die vandaan kwam, plak die dan bij Monty en vraag: “Heeft de shell de opdracht gevonden, heeft Python het script gevonden en is mijn code gestart? Waaraan zien we dat in de melding?” De mislukte laag leren vinden is de vaardigheid. Een paar keer vragen helpt je die op te bouwen.