Skapa fristående binärer av Python-skript
Docker har blivit det nya sättet att paketera och köra Python-skript, även när skripten körs från exempelvis ett cronjob. Men ibland behöver vi inte en hel Docker-miljö med den overhead det innebär för väldigt små skript. Då är det smidigare att göra om skriptet till en körbar binärfil. Då kan vi även enkelt flytta filen mellan olika Linuxsystem.
Bild: Oskar Yildiz på Unsplash
För att skapa en binärfil av ett Python-projekt använder vi pyinstaller
som
går att installera via pip
. Som exempelprojekt kommer vi här att använda
samma Python-skript som vi använde i Pythonmiljö i Docker
– men utan loopen.
Vi placerar alla filerna i en egen katalog så att vi kan installera en
virtuell Pythonmiljö längre fram. Skapa en ny katalog och döp den till
temperatur
eller liknande.
Skriptet består av några få rader kod som hämtar aktuell lufttemperatur i
Ängelholm från SMHIs öppna data. Skriptet, som vi döper till
temperatur.py
, ser ut som nedan:
import requests
import time
import datetime
url = "http://opendata-download-metobs.smhi.se/api/version/1.0/parameter/1/station/62180/period/latest-hour/data.json"
data = requests.get(url).json()
timestamp = data['updated'] / 1000 # SMHIs tidstämpel är i millisekunder
humandate = datetime.datetime.fromtimestamp(timestamp)
print("Temperatur i Ängelholm (" + str(humandate) + "):", data['value'][0]['value'] + "C")
Vi har också skapat en requirements.txt
-fil med följande innehåll:
requests
Testkör skriptet i en Pythonmiljö
Vi börjar med att initialisera en Pythonmiljö och installera de moduler som krävs för att testköra skriptet:
$ pwd
/home/jake/temperatur
$ python3 -m venv env
$ source env/bin/activate
$ pip install -r requirmenets.txt
Collecting requests
Downloading requests-2.31.0-py3-none-any.whl (62 kB)
|████████████████████████████████| 62 kB 882 kB/s
Collecting urllib3<3,>=1.21.1
Downloading urllib3-2.0.2-py3-none-any.whl (123 kB)
|████████████████████████████████| 123 kB 9.5 MB/s
[...]
Successfully installed certifi-2023.5.7 charset-normalizer-3.1.0 idna-3.4
requests-2.31.0 urllib3-2.0.2
Nu kan vi testköra temperatur.py
genom att starta det med python
-tolkaren,
precis som vi brukar göra.
$ python temperatur.py
Temperatur i Ängelholm (2023-06-03 14:00:00): 16.2C
Skapa en fristående binärfil
Nu när vi vet att skriptet fungerar som tänkt är det dags att skapa en
fristående binär av det. Då kan vi enkelt placera binärfilen i exempelvis
crontab
. Vi kan också flytta filen mellan olika Linuxsystem, så länge det är
samma processorarkitektur och samma libc
-version. Det gör det enklare att
distribuera skriptet till ett stort antal datorer, utan att
behöva tänka på att sätta upp en virtuell Pythonmiljö och installera de
nödvändiga modulerna på varje dator.
Medan vi fortfarande är i den virtuella Pythonmiljö installerar vi
pyinstaller
.
$ pip install pyinstaller
Collecting pyinstaller
Downloading pyinstaller-5.11.0-py3-none-manylinux2014_x86_64.whl (653 kB)
|████████████████████████████████| 653 kB 4.4 MB/s
[...]
Successfully installed altgraph-0.17.3 pyinstaller-5.11.0
pyinstaller-hooks-contrib-2023.3
Nu kan vi skapa den körbara filen:
$ pyinstaller temperatur.py --onefile
73 INFO: PyInstaller: 5.11.0
73 INFO: Python: 3.9.2
75 INFO: Platform: Linux-6.1.0-0.deb11.5-amd64-x86_64-with-glibc2.31
[...]
Nu är programmet klart och finns under dist
-katalogen.
$ cd dist
$ ls -l
total 6296
-rwxr-xr-x 1 jake jake 6446528 jun 3 15:13 temperatur
$ ./temperatur
Temperatur i Ängelholm (2023-06-03 14:00:00): 16.2C
Nu kan vi flytta filen till en annan dator om vi skulle vilja, så länge det är
samma libc
-version och arkitektur.
$ scp temperatur 192.168.0.5:temperatur
temperatur 100% 6295KB 84.7MB/s 00:00
$ ssh 192.168.0.5
$ ./temperatur
Temperatur i Ängelholm (2023-06-03 14:00:00): 16.2C
$ exit
Om programmet inte fungerar på ett annat system
Skulle programmet inte fungera på ett annat system kan vi kontrollera vilka
bibliotek som det är länkat till och dess versioner. Det gör vi med ldd
.
$ ldd temperatur
linux-vdso.so.1 (0x00007ffff34fe000)
libdl.so.2 => /lib/x86_64-linux-gnu/libdl.so.2 (0x00007f9976383000)
libz.so.1 => /lib/x86_64-linux-gnu/libz.so.1 (0x00007f9976366000)
libpthread.so.0 => /lib/x86_64-linux-gnu/libpthread.so.0 (0x00007f9976344000)
libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f997617f000)
/lib64/ld-linux-x86-64.so.2 (0x00007f997638f000)
Det enklaste är att helt enkelt bygga om binärfilen med pyinstall
på de
system där den inte fungerar. Filen kommer då att fungera på alla liknande
system med samma version av exempelvis libc
.
Nyhetsbrev
Nyhetsuppdateringar från tidningen direkt till din inkorg, helt kostnadsfritt. Avsluta när du vill.
Relaterade artiklar
-
Hämta data från API:er med cURL och jq
Med cURL och jq går det att extrahera data från API:er direkt från kommandoraden. Jq är en JSON-tolkare och beskrivs av utvecklarna som sed och awk för JSON.
-
Pythonmiljö i Docker
Ett vanligt användningsområde för Docker är att skapa och köra virtuella Pythonmiljöer. Med en Dockerfile och Docker Compose kan vi automatisera hela processen, från skapandet av miljön till exekveringen.
-
Python och trigonometri
Lite uppfräschning av trigonometri och Python är aldrig fel. Här får vi lära oss hur man kan rita upp rätvinkliga trianglar – direkt i Python – om vi känner till två av sidorna. För detta kommer vi att använda modulerna turtle och math.
-
Python i Windows utan installation
Det går att använda Python i Windows, även utan att installera det. Detta är användbart om du har en dator där du inte har rättigheter att installera program. Det kan till exempel vara en skoldator eller arbetsdator.
Senaste nyheterna och inläggen
-
Avlyssna trafik på servern med Wireshark och TShark
Wireshark är ett ovärderligt verktyg för att felsöka nätverkskonfigurationer, applikationer, API:er, demoner och mycket annat. I kombination med
tshark
kan vi dessutom avlyssna trafiken på en server i realtid. -
Mysig stämning på sommarens första demoparty
I helgen var det Reunion 2024 i Kvidinge Folkets hus, sommarens första skånska demoparty. Partyt organiserades av Jesper “Skuggan” Klingvall. På plats fanns ett 30-tal besökare.
-
Sommarens skånska demopartyn
Årets sommar bjuder på två skånska demopartyn. Först ut är Reunion i Kvidinge den 28–30 juni. Därefter är det Pågadata i Örtofta den 9–11 augusti.
-
Riskerna med BankID som ingen pratar om
BankID är ett säkert och smidigt sätt att identifiera sig online. Men i takt med dess ökade popularitet och användning har det blivit en svag länk – en single point of failure – på mer än ett sätt.
-
Polisernas fängelsedomar står fast
Efter tre år är målet mot de två poliser som olovligen tog sig in i en berusad mans bostad i Landskrona och misshandlade honom klart. Högsta domstolen beslutade den sjätte mars att avvisa överklagan. Fängelsedomarna för poliserna står därmed fast.
Utvalda artiklar
-
Mysig stämning på sommarens första demoparty
I helgen var det Reunion 2024 i Kvidinge Folkets hus, sommarens första skånska demoparty. Partyt organiserades av Jesper “Skuggan” Klingvall. På plats fanns ett 30-tal besökare.
-
Datorparty i Landskrona
I helgen höll Syntax Society sitt årliga sommarparty. Platsen var en källarlokal i Landskrona där ett femtontal personer medverkade.
-
Det första Pågadata har ägt rum
I helgen ägde det första Pågadata rum – uppföljaren till Gubbdata. Platsen var Folkets Hus i Kvidinge. Organisatör av partyt var Johan “z-nexx” Osvaldsson med hjälp från Jesper “Skuggan” Klingvall. Partyt hade över 100 anmälda deltagare.
-
Även hovrätten fäller poliserna för att ha satt dit oskyldig
Hovrätten fastställer straffet för de två poliser som förra året dömdes till vardera ett års fängelse av Lunds tingsrätt för att ha misshandlat och satt dit en oskyldig man. De båda poliserna ska även betala skadestånd till mannen.
-
Retroloppis i Påarp
Idag var det retroloppis hos Andreas Nilsson i Påarp. På baksidan av huset fanns hundratals spel uppradade på långa bord. Trots friska vindar och sval temperatur var loppisen välbesökt.
CyberInfo Sverige är ett it- och medieföretag i nordvästra Skåne som tillhandahåller böcker, utbildningar, nyheter och konsulttjänster inom Linux, säkerhet och programmering.
CyberInfo Sverige är godkänd för F-skatt, är momsregistrerat och innehar
utgivningsbevis för webbplatsen www.cyberinfo.se.