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:
- giv eksekver rettigheder
- tilføj she-bang linie i scriptet
- kopier script-filen, så den findes uden
.py
-ændelse - kopier script-filen (kopien uden ændelse), til en mappe med path. F.eks.
/usr/local/bin
- ADVANCERET: lav et symlink fra
/usr/local/bin
i stedet for at kopiere.
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.
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.
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...)
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
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'?