Python: Kompilera till "fristående program" ? Linux Raspberr

C, C++, Pascal, Assembly, Raspberry, Java, Matlab, Python, BASIC, SQL, PHP, etc.
Användarvisningsbild
JimmyAndersson
Inlägg: 26308
Blev medlem: 6 augusti 2005, 21:23:33
Ort: Oskarshamn (En bit utanför)
Kontakt:

Python: Kompilera till "fristående program" ? Linux Raspberr

Inlägg av JimmyAndersson »

Jag vill alltså göra om ett python-script (filändelse .py) till ett program som kan köras fristående,
dvs utan att behöva ha Python installerat. Som ett 'vanligt' program. I Linux, på en Raspberry Pi.

Min främsta förhoppning är att detta kommer att göra mitt program snabbare på att köra instruktionerna.

Så jag läste här:
http://docs.python.org/2/library/compil ... e-compiler

"compiler.compile(source, filename, mode, flags=None, dont_inherit=None)

Compile the string source, a Python module, statement or expression, into a code object that can be executed by the exec statement or eval(). This function is a replacement for the built-in compile() function."



Därefter startade jag Python, genom att helt enkelt skriva python i terminalfönstret.

Python 2.7.3 (default, Jan 13 2013, 11:20:46)
[GCC 4.6.3] on linux2

>>>


Så där skriver jag:
compiler.compile(filnamnet.py)
Testade både 'exec' och 'single' som mode.

och får:
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
NameError: name 'compiler' is not defined


Nitlott direkt.
Jag har även provat
python compile(filnamnet.py)
help(compile)
compile
osv..


Jag har ägnat 1½ timma med att söka på Google, men jag hittar bara diskussioner mellan interpreterande
och kompilerande språk och att man i Python kompilerar med "python yourfile.py".
Inte riktigt vad jag är ute efter.

Jag har använt sökord som:
python compile ".py"
how to compile python sourcecode raspberry (här valde jag "Ordagrant" i Google, men fick ändå inte något i närheten.)
python "compiler.compile" manual
osv...


Någon här som kan hjälpa mig? :)
TobiasEinarsson
Inlägg: 58
Blev medlem: 6 september 2012, 11:15:33
Ort: Göteborg

Re: Python: Kompilera till "fristående program" ? Linux Rasp

Inlägg av TobiasEinarsson »

Som jag förstår det så kan du bara generera "Python bytecode" med "compiler"-paketet.

För att kompilera till en fristående exekverbar fil behöver du använda något i stil med PyInstaller:
http://www.pyinstaller.org/

Jag är dock osäker på om du kommer märka någon större skillnad rent prestandamässigt.
ds77
Inlägg: 2233
Blev medlem: 24 juli 2008, 09:38:07
Ort: småland

Re: Python: Kompilera till "fristående program" ? Linux Rasp

Inlägg av ds77 »

Användarvisningsbild
sodjan
EF Sponsor
Inlägg: 43192
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping
Kontakt:

Re: Python: Kompilera till "fristående program" ? Linux Rasp

Inlägg av sodjan »

En förutsättning är att "compile" är inkluderad i den aktuella Python miljön:

Kod: Markera allt

$ python
Python 2.7.5 (default, Aug 27 2013, 13:49:09) [DECC] on OpenVMS
Type "help", "copyright", "credits" or "license" for more information.
>>>
>>> help (compile)
Help on built-in function compile in module __builtin__:

compile(...)
    compile(source, filename, mode[, flags[, dont_inherit]]) -> code object
    
    Compile the source string (a Python module, statement or expression)
...
...
Om en inte är det så har man väl ansett att det inte var lönt mödan.

Och som sagt, "compile" compilerar enbart .py filer till .pyo, vilket
normalt sker i alla fall första gången en .py fil körs. Om den som kör
.py filen har skrivrättigheter till samma katalog, så ger "compile" alltså
ingen spm helst fördel. Däremot kan det ju vara så att den som kör
inte får skriva .pyo (eller .pyc ?) filen, och då kan ju en admin
kör "compile" i förväg, så att säga.

Dessutom, för verktyg som py2exe och liknande, så krävs det dessutom
att verktyget i sig är portat till den aktulla arkitekturen, det ska ju skapas
binära EXE som körs direkt på processorn.
Användarvisningsbild
JimmyAndersson
Inlägg: 26308
Blev medlem: 6 augusti 2005, 21:23:33
Ort: Oskarshamn (En bit utanför)
Kontakt:

Re: Python: Kompilera till "fristående program" ? Linux Rasp

Inlägg av JimmyAndersson »

"Compile" finns inkluderat. Jag ser motsvarande text som i din kodruta när jag kör help(compile).


Jag tänkte börja att testa första tipset: PyInstaller.
I guiden här:
http://www.pyinstaller.org/export/d3398 ... ller-setup

..så börjar de med "In the /your/path/to/pyinstaller/ directory, run:"

Hur ska man veta sökvägen till PyInstaller?
Jag har inte hittat en enda sida om sökvägen och varken find eller locate hittar rätt.
Enligt apt-get så är PyInstaller installerat.
Frågan är bara *var*...



ds77:
Jag förstod frågan på den sajten, men sedan blev det på tok för rörigt och många sidospår i svaren.
Hur vet man vad man ska välja där.. :)
ds77
Inlägg: 2233
Blev medlem: 24 juli 2008, 09:38:07
Ort: småland

Re: Python: Kompilera till "fristående program" ? Linux Rasp

Inlägg av ds77 »

Testa dig fram tills du hittar något som fungerar för dig är mitt tips..
Användarvisningsbild
JimmyAndersson
Inlägg: 26308
Blev medlem: 6 augusti 2005, 21:23:33
Ort: Oskarshamn (En bit utanför)
Kontakt:

Re: Python: Kompilera till "fristående program" ? Linux Rasp

Inlägg av JimmyAndersson »

Enda nackdelen är att det tar väldigt lång tid och att man stöter på en massa fallgropar som är svåra att ta sig ur. :)
Ofta får jag då svar av typen "Men varför gör du sådär? Det är fel."
Hur skulle jag kunna veta det liksom... :)


Jag får nog kanske backa med påståendet att PyInstaller är installerat.
apt-cache pkgnames |grep pyinstaller* hittar ingenting,
men den hittar iofs bara paket som den själv har installerat.

apt-cache search pyinstaller hittar inget, så jag får nog installera det manuellt.
Jag återkommer med resultatet. :)

edit:
Är enda sättet att ladda ner pyinstaller med t.ex wget?
Man *kan* ju få lite problem med beroende-fel och liknande
så det brukar rekommenderas att man alltid kör med apt-get.
Men i det här fallet så lyckas jag inte hitta pyinstaller där...

Sedan ska man ju lyckas hitta en sökväg också....
Att söka i Google efter debian wget URL pyinstaller eller liknande ger ingenting.

Lyckades snappa upp sökvägen och laddade ner med:
wget http://sourceforge.net/projects/pyinsta ... .0.tar.bz2
Jaha ja.. den filen hamnade visst i katalogen jag stod i...
Det var länge sedan jag använde wget, men jag hade för mig att filer brukade hamna i en temp-katalog. :oops:

Därefter packade jag upp filen och flyttade katalogen pyinstaller-2.0 till /etc/pyinstaller-2.0

Där finns nu dessa filer och kataloger:
buildtests
doc
e2etests
examples
PyInstaller
source
support
utils

MANIFEST.in
pyinstaller-gui.py
README.rst
pyinstaller.py
setup.py
(De mer blåmarkerade är kataloger.)

Så enligt guiden ska man nu kliva in i PyInstaller-katalogen
och köra:

python Configure.py

Jag får felet att det inte finns någon fil som heter "Configure.py".
Det ska vara litet c där.

Då får jag:

Traceback (most recent call last):
File "configure.py", line 28, in <module>
from PyInstaller import HOMEPATH, PLATFORM
ImportError: No module named PyInstaller



Jag trodde att det var just PyInstaller som jag just laddat ner och skulle installera??
:doh:


Som vanligt finns det många olika förslag på hur man fixar det:
http://stackoverflow.com/questions/1195 ... yinstaller

Väljer man bara slumpmässigt en ur högen eller hur gör man för att välja vilken lösning som är rätt?
Användarvisningsbild
sodjan
EF Sponsor
Inlägg: 43192
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping
Kontakt:

Re: Python: Kompilera till "fristående program" ? Linux Rasp

Inlägg av sodjan »

> Hur ska man veta sökvägen...

Det borde väl vara någonstans i Python "trädet".

http://djangotricks.blogspot.se/2008/09 ... paths.html
http://docs.python.org/2/using/cmdline. ... -variables

Det står även :

> First, unpack the archive on your path of choice. Installer is not a Python package, so it doesn't
> need to go in site-packages, or have a .pth file. For the purpose of this documentation we will
> assume /your/path/to/pyinstaller/.

Du bestämmer alltså själv vart "/your/path/to/pyinstaller/" pekar...
Nerre
Inlägg: 26759
Blev medlem: 19 maj 2008, 07:51:04
Ort: Upplands väsby

Re: Python: Kompilera till "fristående program" ? Linux Rasp

Inlägg av Nerre »

Jag har ingen vidare bra koll på Python (jag borde dock skaffa mig, eftersom Scribus använder Python som scriptspråk), men jag har en del erfarenheter av att försöka göra nåt efter diverse howto-sidor på Nätet och det finns en del saker man bör tänka på.

Gör ALDRIG ALDRIG exakt bara vad som står utan att försöka förstå varför. Det finns tillfällen där en felplacerad punkt eller ett missat mellanslag kan göra att du totalsabbar nånting.

Saker utvecklas. Om du följer en instruktion som skrevs för 3-4 år sen så stämmer antagligen inte allt. Visas filer kan ha bytts ut, flyttats, bytt namn, delats upp i flera filer, slagits ihop etc. Default-värden kan ha ändrats.

Väldigt många som skriver såna där artiklar gör saker på "fel sätt". De skriver switchar på kommandoraden som redan är default (och alltså inte behövs), de skriver jättelånga kommandorader istället för att redigera en konfig-fil, de kör en massa manuella kommandor när distributionen i fråga har hjälpprogram för den hanteringen etc.

Ofta missar de dessutom steg, ibland verkar det bero på att de skrivit om artikeln och andra gånger verkar de bara ha glömt det efter att ha skrivit fritt ur minnet.


Jag brukar försöka hitta minst 2-3 sidor som beskriver samma sak, sen jämför jag dem, titta på vad som är lika och vad som skiljer. Och sen tittar jag på steg för steg och försöker lista ut vad de egentligen gör och varför. Fattar jag inte direkt så googlar jag vidare, kollar man-sidor etc.


Sen undviker jag in i det längsta att kopiera in saker till systemmapparna (/etc, /usr etc). Experimenterar gör jag i första hand i min /home (helst utan att vara root), sen om det ska köra på systemnivå så lägger jag det under t.ex. /usr/local.
Användarvisningsbild
JimmyAndersson
Inlägg: 26308
Blev medlem: 6 augusti 2005, 21:23:33
Ort: Oskarshamn (En bit utanför)
Kontakt:

Re: Python: Kompilera till "fristående program" ? Linux Rasp

Inlägg av JimmyAndersson »

Gör ALDRIG ALDRIG exakt bara vad som står utan att försöka förstå varför.
Väldigt många som skriver såna där artiklar gör saker på "fel sätt".


Så hur ska man som nybörjare upptäcka sådant?
"Open Source"-tänket bygger ju ändå på att vem som helst ska kunna bidra
och då finns det sällan 1st officiell sajt där man vet att *här* står det rätt.
Man är alltså utelämnad till diverse guider och forum.

Men jag är medveten om att man måste avgöra själv ifall det är något man är villig att riskera.
Det är ju precis som det här forumet: Följer man fel tips så kan man sitta där med svedda ögonbryn. :)



"Jag brukar försöka hitta minst 2-3 sidor som beskriver samma sak"

Jag gör också så, i den mån det går.
Tyvärr går det sällan, för det verkar vara en sport att försöka beskriva på så många olika sätt som möjligt.
Sedan är ju Googles princip att den främst listar de träffar som de tycker att man ska se,
inte nödvändigtvis det som faktiskt stämmer överens med det man skrev in i sökrutan.
Så då man kan man få många sidor som beskriver samma sak - men alltså inte det man letade efter.
Även med valet "Ordagrant" så har Google börjat lusa ner med "liknande" träffar.


"Fattar jag inte direkt så googlar jag vidare"

Det är en bra princip som jag följt de senaste åren.
Är det inte tillräckligt tydligt så stänger jag fliken.
Om jag sedan inte hittar något vettigt så backar jag ett steg i "krav"
och tillslut kan det bli så att man ändå måste kolla upp de kilometerlånga invecklade förklaringarna.
Om inte det heller leder någon vart, så stänger jag ned allt och återvänder till enbart mig själv
och filtrerar det som fastnat i minnet. Det är då som logiken och lösningarna brukar dyka upp.



"Sen undviker jag in i det längsta att kopiera in saker till systemmapparna (/etc, /usr etc)."

Att jag valde /etc var för att Python ligger där. Jag tänkte helt enkelt att PyInstaller borde vara på samma ställe.

Vilket leder mig till:


Sodjan:
Du bestämmer alltså själv vart "/your/path/to/pyinstaller/" pekar...

Det förstår jag. Men den sökvägen måste ju gå till platsen där PyInstaller finns.

Det borde väl vara någonstans i Python "trädet".

Nyckelordet där är "någonstans". :)

Var denna plats var visste jag däremot inte.
Men det visade sig att PyInstaller inte alls var installerat och tillslut löste jag den biten.




För tillfället är som sagt felet:
Traceback (most recent call last):
File "configure.py", line 28, in <module>
from PyInstaller import HOMEPATH, PLATFORM
ImportError: No module named PyInstaller


(Se mer i slutet av mitt förra inlägg.)

--

Ett litet sidospår, men ändå en av orsakerna till varför jag vill få ut ett fristående program:

Hur korta sleep() man kan ha avgörs ju främst av OS, CPU, osv.
Jag är nyfiken på ifall och hur "timeing" även påverkas av ifall ett python-script körs "genom"
python-tolken jämfört med när scriptet körs efter att ha kompilerats till ett fristående program.
Det kanske inte ger någon betydande skillnad alls, men det vore kul att testa.

Med en Raspberry Pi, en portexpander-krets via I2C så verkar gränsen för
hur snabbt man kan toogla en pinne (och få stabil kurva) vara ca 5ms. Vid 2ms blir det lite svajigt.
Vid 1ms ser det inte bra ut på oscilloskopet. Det ser ut som man rör X-position-poten fram och tillbaka.
100µs är gränsen för att det ska se ut som att oscilloskopets trig-funktion har gått sönder. :)

edit: Ändrade ns till µs. :oops:
(ca 400µs verkar vara gränsen för att toggla en pinne även utan någon sleep.)
Det krävs sleep(0.0000001) för att få samma frekvens på oscilloskopet som utan något sleep.)
Användarvisningsbild
sodjan
EF Sponsor
Inlägg: 43192
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping
Kontakt:

Re: Python: Kompilera till "fristående program" ? Linux Rasp

Inlägg av sodjan »

> Men det visade sig att PyInstaller inte alls var installerat...

Ja, det förstog jag, det var därför jag sa att man väljer pathen själv
(d.v.s när man packar upp kittet till PyInstaller). :-)

> Med en Raspberry Pi, en portexpander-krets via I2C så verkar gränsen för
> hur snabbt man kan toogla en pinne...

Ja, det är ju sannolikt inte alls ett område där Python är "bäst" eller
kanske ens lämpligt. Rent tekniskt fungerar det ju, men med en viss
overhead.

Sen när deet gäller grundproblemet (snabbare exekvering) så är det inte
säkert att det blir någon skillnad alls. Ta t.ex Py2exe, det kan låta som att
den "kompilerar" en eller flera .py filer till något slags EXE som sedan går
mycket snabbare att köra. Det gör den inte, den paketerar bara Python
interpretatorn tillsammans med .py filena i en EXE, internt sker körningen
ungefär på samma sätt som "normalt".

Cython däremot kompilerar .py filer till maskinkod/binärkod, men dessa är
i form av Python "extensions" och måste fortfarande köras från den vanliga
Python interpretern, men modulerna i sig går snabbare när de anropas
från din huvud Python kod.

Det finns så vitt jag vet ingen ren Python-compiler som från en valfri .py
fil skapar en stand-alone EXE. Notera att även Cython ställer vissa krav
på Python koden och stöder bara ett subset av Python för att fungera.

Om man börjar leta efter kompilerad Python så använder man
sannolikt fel verktyg från början.
Användarvisningsbild
PHermansson
EF Sponsor
Inlägg: 4340
Blev medlem: 22 december 2004, 00:46:38
Ort: Särestad Grästorp
Kontakt:

Re: Sv: Python: Kompilera till "fristående program" ? Linux

Inlägg av PHermansson »

Ja jagar man prestanda är det ju C som gäller. Och då blir det garanterat enklare att kompilera på pi'n.
Nerre
Inlägg: 26759
Blev medlem: 19 maj 2008, 07:51:04
Ort: Upplands väsby

Re: Python: Kompilera till "fristående program" ? Linux Rasp

Inlägg av Nerre »

JimmyAndersson skrev:Gör ALDRIG ALDRIG exakt bara vad som står utan att försöka förstå varför.
Väldigt många som skriver såna där artiklar gör saker på "fel sätt".


Så hur ska man som nybörjare upptäcka sådant?
Det skrev jag ju: Ta reda på vad kommandona gör, vad parametrarna betyder etc.

Jag menar alltså att man inte bara i blindo ska skriva av eller kopiera ett kommando utan att förstå vad kommandot gör och varför det körs.



Jag tror inte på att Python ligger under /etc, detta eftersom /etc enligt Linux FHS är platsen för konfigurationsfiler.
http://sv.wikipedia.org/wiki/Filesystem ... y_Standard

Mer troligt är att själva python-kommandot ligger under /usr/bin och sen ligger det antagligen en massa grejs (som inkluderas) under /usr/lib eller /usr/share. Det är nog bara konfigurationen som ligger under /etc.
Användarvisningsbild
007sweden
Inlägg: 3500
Blev medlem: 3 mars 2005, 20:18:12
Skype: oo7sweden

Re: Python: Kompilera till "fristående program" ? Linux Rasp

Inlägg av 007sweden »

I min erfarenhet (kompilerat pythonprogram för windows) så det som händer när du kompilerar är att pythoninterpretern och alla moduler etc trycks ihop till ett litet paket, dvs, det är fortfarande din .py fil som körs (omän kompilerad till bytecode) i standard-interpretern.
Därför kommer du knappast få någon performanceboost bara för att du byggt ihop programmet till en fristående paket.

Det du kan prova är att kolla upp PyPy, påstår sig köra pythonprogram mellan 5 och 10 gånger snabbare än CPython (orginala pythoninterpretern).

Edit: Sodjan skrev ju just det jag skrev ovan om kompilering. :doh: Se det som att jag håller med sodjan då. :D
Användarvisningsbild
sodjan
EF Sponsor
Inlägg: 43192
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping
Kontakt:

Re: Python: Kompilera till "fristående program" ? Linux Rasp

Inlägg av sodjan »

He he, tur att "editen" var med, då slapp jag göra en syrlig kommentar... :-)
Skriv svar