Skip to content

Instantly share code, notes, and snippets.

@s0ren
Created November 29, 2022 13:50
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save s0ren/6a90e3fe0f8710654f7461d75c8033a6 to your computer and use it in GitHub Desktop.
Save s0ren/6a90e3fe0f8710654f7461d75c8033a6 to your computer and use it in GitHub Desktop.
Gør python-script eksekverbart

Gør et python-script eksekverbart

Jeg har lavet et python-script som renser LED'erne på SenseHat, så alle er slukket. Det er en dejlig lille utillity som kan bruges hvis nogen har afbrudt et program der bruger disse LED'er, men ikke fik ryddet op.

from sense_hat import SenseHat

sense = SenseHat()
sense.clear()

Scriptet kan køres med kommandoen:

$ python clearhat.py

men jeg vil gerne have at det var en kommando i linux, ligesom lixux kommandoen clear der rydder terminalen.

Der er 4 ting vi skal gøre:

  1. giv eksekver rettigheder
  2. tilføj she-bang linie i scriptet
  3. kopier script-filen, så den findes uden .py-ændelse
  4. kopier script-filen (kopien uden ændelse), til en mappe med path. F.eks. /usr/local/bin
  5. ADVANCERET: lav et symlink fra /usr/local/bin i stedet for at kopiere.

1. giv eksekver rettigheder

Man kan gøre scriptfilen ekskverbar ved at ændre dens attributter i linux. Man skal natirligvis og lave trin to for at det giver mening og virker...

Først checker vi attributterne:

$ ls -l clearhat.py
-rw-r--r-- 1 pi pi 83 Nov 29 14:48 clearhat.py

Vi bruger kommandoen chmod

$ chmod a+x clearhat.py

og checker igen

$ ls -l clearhat.py
-rwxr-xr-x 1 pi pi 83 Nov 29 14:48 clearhat.py

Bemærk at nu har alle x.

Så nu kan man prøve at eksekvere scriptet direkte, uden at skrive python foran (bemærk at man dog skal skrive ./ foran, fordi der ikke default er path til det aktive directory. I linux shell betyder . 'det nuværende bibliotek' ):

$ ./clearhat.py 
./clearhat.py: line 3: from: command not found
./clearhat.py: line 5: syntax error near unexpected token `('
./clearhat.py: line 5: `sense = SenseHat()'

Nu får vi en masse fejl fordi terminalen (og bash) tror at det er et bash-script.

Så videre til trin 2.

2. tilføj she-bang linie i scriptet

For at scriptet kan fungere, skal bash vide hvilken fortolker har skal bruges. Her er det jo python.

Vi skal altså tilføje en linie øverst i scriptet med #! (she-bang) efterfulgt af python fortolkenren, med fuld sti og det hele. Python er installeret i /bin, så jeg skriver, med det hele

#! /bin/python

Så nu ser scriptet sådan her ud:

#! /bin/python

from sense_hat import SenseHat

sense = SenseHat()
sense.clear()

Nu kan man eksekvere:

$ ./clearhat
WARNING:root:Failed to initialise TCS34725 colour sensor. (sensor not present)

Ok. Der kommer en træls warning, men ellers virker det.

3. kopier script-filen, så den findes uden .py-ændelse

En rigtig kommando har jo ikke en .py endelse, så den skal væk.

Jeg laver en kopi med:

$ cp clearhat.py clearhat

og checker

$ ls -l clearhat*

-rwxr--r-- 1 pi pi 82 Nov 29 15:58 clearhat -rwxr-xr-x 1 pi pi 85 Nov 29 15:26 clearhat.py

Så nu kan scriptet køres med:

$ ./clearhat
(ja _warning igen...)

4. kopier script-filen (kopien uden ændelse), til en mappe med path. F.eks. /usr/local/bin

Vi vil gerne have man kan køre kommandoen, uden at skrive ./ foran.

Default, er der ikke path til 'det aktuelle dir', det man står i. Heller ikke til brugeren hjemme dir (home dir aka ~).
Vi kunne godt konfigurere et path, men det er lettere at kopiere scriptet hen i mappe hvor der allerede er path. Det er iøvrigt også der alle kommander ellers ligger, så det skal min da også ;-)

sudo cp clearhat /usr/bin/clearhat

Jeg skal bruge sudo fordi der kun er skrive rettigheder i /user/bin for root.
Nu ligger scriptet clearhat i en mappe hvor der er path til, så kan jeg køre scriptet uden ./

$ clearhat

5. ADVANCERET: lav et symlink fra /usr/local/bin i stedet for at kopiere.

Det kan være lidt træls har have sin kode liggende i /usr/local/bin eller et tilsvarende sted. Derfor kan jeg vælge at lade det ligge i en mappe under mit hjemme bibliotek (~). Lige nu ligger det i f.eks. både i ~/python_projects/clearhat_command og i /usr/local/bin. Jeg kan blive i tvivl om hvilket er der opdateret... osv.

Hvis jeg nu kun har scriptet under hjemmemappen, og i stedet for laver et link der henviser fra /usr/local/bin til der hvor der er uder mit ~, så bliver det hele lettere.

Derfor vil jeg gerne bruge kommandoen ln

(først fjerner jeg lige kopien: sudo rm /usr/local/bin/clearhat)

$ sudo ln -s /home/pi/python_projects/clearhat_command/clearhat.py /usr/local/bin/clearhat

Man bør bruge fulde absolutte stier, når man definerer symlinks med ln -s.

$ ls -l /usr/local/bin/clear*
lrwxrwxrwx 1 root root 53 Nov 29 16:42 /usr/local/bin/clearhat -> /home/pi/python_projects/clearhat_command/clearhat.py

Nu kan jeg teste:

$ clearhat

Smart, ikk'?

#! /bin/python
from sense_hat import SenseHat
sense = SenseHat()
sense.clear()
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment