[python] executables maken

Pagina: 1
Acties:
  • 129 views sinds 30-01-2008
  • Reageer

  • marty
  • Registratie: Augustus 2002
  • Laatst online: 27-03-2023
Ik ben gisteren met python begonnen. Wilde er al een tijdje aan beginnen, maar kwam er telkens niet van, maar had nu heel erg een proggie nodig, dus dacht: goed moment :)
Anyways, na wat gezweet heb ik een eerste versie in elkaar kunnen draaien en ben toen gaan zoeken naar hoe je er een executable van kon maken. En ook dat is gelukt.
Tot mijn grote schrik wordt het geheel alleen ruim 5 MB groot! Dat kan toch niet de bedoeling zijn? Vind het verder ook een beetje jammer dat het niet gewoon 1 exe file wordt, maar gelijk 189 files verdeelt over 14 directories. En dat voor zoiets simpels.... (Ik heb hiervoor py2exe gebruikt).
Is dat gewoon niet anders als je python gebruik?

Ik zal m'n broncode even geven, misschien dat ik wel iets niet goed doe:

Python:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
from Tkinter import *
import os
import os.path
class App:
    def __init__(self, master):
        frame = Frame(master)
        frame.pack()
        self.button = Message(frame, text="Enter Bookmarks Dir", fg="black")
        self.button.pack(side=LEFT)
        self.location = Entry(frame, fg="blue")
        self.location.pack(side=LEFT)
        self.hi_there = Button(frame, text="OK", command=self.writefile)
        self.hi_there.pack(side=LEFT)
    def writefile(self):
        print self.location.get()
        self.getfilecontents(self.location.get())
    def getfilecontents(self, ld, deep="", defaultdir=""):
        output=""
        if len(defaultdir) > 0:
            deep = deep+'|DIR|'+defaultdir
        d = os.listdir(ld)
        for x in d:
            path = ld+'\\'+x
            if os.path.isdir(path):
                f=open('urls2.txt','a')
                f.write(output)
                f.close()
                output=""
                print 'listing '+path
                self.getfilecontents(path, deep, x)
            else:
                if x[-3:] == "url":
                    name = x[0:-4]
                    f=open(path, 'r')
                    allines=f.readlines()
                    f.close()
                    for l in allines:
                        if l[0:3] == "URL":
                            output = output+deep+'|BKMRK|'+name+'||'+l[4:-2]+'\n'
        f=open('urls2.txt','a')
        f.write(output)
        f.close()

root = Tk()
app = App(root)
root.mainloop()
Wat het doet: het leest een directorie in en scant vervolgens voor bookmarkfiles, waar het de bookmark uit haalt en wegschrijft in een file (hierbij wordt ook de directorie waarin de bookmark staat weggeschreven)

Er zal nog wel onwijs veel aan mankeren, maar het is dan ook pas m'n eerste proggie in python (heb verder alleen php ervaring). (die functie writefile() is bijvoorbeeld een beetje overbodig). Ook moet ik nog heel veel dingen inbouwen zoals nette foutafhandeling, exit-knopje, etc. Dat weet ik.

Maar wat ik dus eerst graag wil weten is: is het normaal dat die executable met alle andere files erbij zo groot worden en zoveel? Of ligt dat aan mijn code dat het zo groot wordt?
Anders vind ik het nog wel het overwegen waard om op een andere programmeertaal over te stappen, want ik wil in de toekomst nog wel wat meer van dit soort 'kleine' dingen schrijven. If so, welke raden jullie me dan aan?

  • hennink
  • Registratie: Augustus 2000
  • Laatst online: 12-08 19:50
kijk eens of je het met static libs hebt gecompileerd.
Dynamic scheelt je een hoop in grootte, alleen weet je zelf waarom je eigenlijk static wilt hebben.

Verder kan je gzexe gebruiken om je binary in te pakken, heeft uiteraard negatieve invloed op de snelheid waarmee het script start

[ Voor 54% gewijzigd door hennink op 15-08-2003 16:57 ]

alles wat aan kan, gaat kapot. De vraag is alleen wanneer.


  • marty
  • Registratie: Augustus 2002
  • Laatst online: 27-03-2023
hennink schreef op 15 August 2003 @ 16:54:
kijk eens of je het met static libs hebt gecompileerd.
Dynamic scheelt je een hoop in grootte, alleen weet je zelf waarom je eigenlijk static wilt hebben.

Verder kan je gzexe gebruiken om je binary in te pakken, heeft uiteraard negatieve invloed op de snelheid waarmee het script start
met py2exe bedoel je? ik kan die optie nergens vinden in de help...

  • hennink
  • Registratie: Augustus 2000
  • Laatst online: 12-08 19:50
Is het soms een win32 binary?

alles wat aan kan, gaat kapot. De vraag is alleen wanneer.


  • marty
  • Registratie: Augustus 2002
  • Laatst online: 27-03-2023
hennink schreef op 15 August 2003 @ 17:06:
Is het soms een win32 binary?
http://starship.python.net/crew/theller/py2exe/
denk dat het makkelijker is als je zelf even kijkt :) Heb je gelijk al je antwoorden

  • hennink
  • Registratie: Augustus 2000
  • Laatst online: 12-08 19:50
had het al gezien, maar je mocht het voor me vertellen.
Laat dan de antwoorden maar zitten, had een ander platform in gedachten dan degene die je gebruikt.
Hopenlijk kan iemand anders je helpen

alles wat aan kan, gaat kapot. De vraag is alleen wanneer.


  • Johannes
  • Registratie: Juni 2000
  • Laatst online: 29-07 19:20
marty schreef op 15 augustus 2003 @ 16:52:
Maar wat ik dus eerst graag wil weten is: is het normaal dat die executable met alle andere files erbij zo groot worden en zoveel? Of ligt dat aan mijn code dat het zo groot wordt?
Het probleem is dat je als je een standalone executable wilt maken, deze ook heel Python (en bij jou ook nog Tkinter) in de exe moet stoppen. Het ligt dus niet aan je code.

Overigens, waarom wil je er een executable van maken? Dit is eigenlijk alleen nodig als je naar mensen wilt distribueren die geen Python geinstalleerd hebben. Als je een progje voor eigen gebruik schrijft is het veel makkelijker om gewoon de Windows installer van http://python.org/2.3/ af te halen. Dan kun je gewoon je code in een los bestandje zetten en uit laten voeren door Python.

Nu ik even naar je code kijk zie ik trouwens dat je blijkbaar een aantal functies nog niet kent. Ik zou ik in ieder geval kijken naar os.walk() en os.path.join(). Die zullen je script waarschijnlijk nog wat versimpelen.

[ Voor 12% gewijzigd door Johannes op 15-08-2003 18:08 ]

Uit volle borst op weg naar nergens / Zonder reden zonder doel
Met m'n zeden en m'n zonden / En mijn angstig voorgevoel
Laat mij mijn kont tegen de krib / Laat mij dit goddeloze lied
Hef jij je handen maar ten hemel / Maar red mij niet


  • marty
  • Registratie: Augustus 2002
  • Laatst online: 27-03-2023
Johannes schreef op 15 August 2003 @ 17:58:
[...]

Het probleem is dat je als je een standalone executable wilt maken, deze ook heel Python (en bij jou ook nog Tkinter) in de exe moet stoppen. Het ligt dus niet aan je code.
Maar ik begreep uit wat docs dat ie alleen kijkt wat je nodig hebt...maargoed, dat blijkt dus nog best veel te zijn?
Overigens, waarom wil je er een executable van maken? Dit is eigenlijk alleen nodig als je naar mensen wilt distribueren die geen Python geinstalleerd hebben.
En dat is precies wat ik wil ;)

In wat voor soort taal worden die kleine proggies zoals patches dan geschreven? Die zijn meestal maar een paar k groot en draaien toch in een mooi windows-venstertje

Verwijderd

In wat voor soort taal worden die kleine proggies zoals patches dan geschreven? Die zijn meestal maar een paar k groot en draaien toch in een mooi windows-venstertje
Ik verwacht VB, of gewoon met batch verhuld in vb.....

  • Johannes
  • Registratie: Juni 2000
  • Laatst online: 29-07 19:20
marty schreef op 15 August 2003 @ 18:03:
[...]
Maar ik begreep uit wat docs dat ie alleen kijkt wat je nodig hebt...maargoed, dat blijkt dus nog best veel te zijn?
Python en Tkinter zijn niet enorm, maar ook niet echt klein, nee. :)
In wat voor soort taal worden die kleine proggies zoals patches dan geschreven? Die zijn meestal maar een paar k groot en draaien toch in een mooi windows-venstertje
Patches? Als in cracks ofzo? Waarschijnlijk in Visual Basic. De VB runtime is net zo groot als Python en Tkinter (of in ieder geval in die orde), maar is inbegrepen bij Windows, dus dan kan het programma zelf erg klein zijn, net zoals het geval zou zijn bij een wel geinstalleerde Python.

Uit volle borst op weg naar nergens / Zonder reden zonder doel
Met m'n zeden en m'n zonden / En mijn angstig voorgevoel
Laat mij mijn kont tegen de krib / Laat mij dit goddeloze lied
Hef jij je handen maar ten hemel / Maar red mij niet


  • marty
  • Registratie: Augustus 2002
  • Laatst online: 27-03-2023
Johannes schreef op 15 August 2003 @ 18:14:
[...]

Python en Tkinter zijn niet enorm, maar ook niet echt klein, nee. :)


[...]

Patches? Als in cracks ofzo? Waarschijnlijk in Visual Basic. De VB runtime is net zo groot als Python en Tkinter (of in ieder geval in die orde), maar is inbegrepen bij Windows, dus dan kan het programma zelf erg klein zijn, net zoals het geval zou zijn bij een wel geinstalleerde Python.
Niet persee cracks, maar gewoon allerhande patches.
Maarja...cracks zijn een goed voorbeeld daarvan. Niet dat ik ze zelf ooit gebruik, maar heb dat wel eens bij een vriend van me gezien :)

* marty is nu visual studio aan het downloaden

wel jammer... begon python net leuk te vinden. Vooral de syntax sprak me erg aan. Dat zal met Visual Basic wel ff afkicken worden vrees ik

  • Johannes
  • Registratie: Juni 2000
  • Laatst online: 29-07 19:20
marty schreef op 15 August 2003 @ 19:08:
[...]
* marty is nu visual studio aan het downloaden

wel jammer... begon python net leuk te vinden. Vooral de syntax sprak me erg aan. Dat zal met Visual Basic wel ff afkicken worden vrees ik
Ik zou dan toch jezelf maar eens vragen waarom je nu eigenlijk programmeert. Ik programmeer namelijk omdat ik het leuk vind, en interessant, en hersenstimulerend, uhm, ja. En programmeren in VB is geen van het bovenstaande (voor mij).

Ik zou zelf ervoor kiezen om gewoon kleine tooltjes in Python te blijven schrijven, en dan een linkje naar de Python binaries neer te zetten. Het is toch niet jouw probleem als mensen te lui zijn om iets te installeren zodat je een handig tooltje kan gebruiken?

Uit volle borst op weg naar nergens / Zonder reden zonder doel
Met m'n zeden en m'n zonden / En mijn angstig voorgevoel
Laat mij mijn kont tegen de krib / Laat mij dit goddeloze lied
Hef jij je handen maar ten hemel / Maar red mij niet


  • madwizard
  • Registratie: Juli 2002
  • Laatst online: 26-10-2024

madwizard

Missionary to the word of ska

marty schreef op 15 August 2003 @ 18:03:
[...]
In wat voor soort taal worden die kleine proggies zoals patches dan geschreven? Die zijn meestal maar een paar k groot en draaien toch in een mooi windows-venstertje
Het programma zelf neemt vaak niet veel code in, het is vooral de runtimes die bij de meeste talen zitten. Zolang je die runtime niet gebruikt blijft je programma ook klein. Dat is niet in alle talen mogelijk, sommige zoals VB zitten gewoon erg vast aan de runtime libs.. VB programma's kunnen wel dynamisch gelinkt worden met de lib en dus heel klein zijn. Bij C++ programma's kan dat ook (msvcrt.dll enz.) maar C++ zit minder vast aan de libs. Je kan best een C++ programma schrijven dat puur van de windows API gebruik maakt en geen runtime library functies gebruikt. Dan kan je in een paar kb al een hoop doen. Cracks worden vaak ook in assembler gemaakt omdat daar vrijwel nooit runtimes gebruikt worden en dus meestal heel klein zijn, maar in C kan je meestal hetzelfde wel bereiken.

www.madwizard.org


  • PommeFritz
  • Registratie: Augustus 2001
  • Laatst online: 10-07 04:13

PommeFritz

...geen friet

Heb net met McMillan's Installer een single file executable van je programmatje gemaakt, die is 1,824,524 bytes groot geworden. Dat betekent dus dat de Python interpreter, en de benodigde libs, waaronder TCL/TK (GUI!) in een exe van minder dan 2 Mb zitten. Dat vind ik nogal meevallen!

Heb ook met py2exe een exe gemaakt, en de reden dat je zo veel files mee krijgt is omdat hij ook hier alle runtime files van TCL/TK (GUI!) er bij stopt!

Als je TCL/TK niet mee wilt 'linken' in de exe, dan zul je niet Tkinter moeten gebruiken voor je GUI. Kijk eens naar de win32 extensions voor Python, je kunt dan de native Windows API gebruiken (MessageBox enz). Maar je programmaatje werkt dan alleen op Windows natuurlijk.

Zie trouwens ook de Python FAQ entry.

FireFox - neem het web in eigen hand


  • marty
  • Registratie: Augustus 2002
  • Laatst online: 27-03-2023
Johannes schreef op 15 August 2003 @ 19:59:
Ik zou dan toch jezelf maar eens vragen waarom je nu eigenlijk programmeert. Ik programmeer namelijk omdat ik het leuk vind, en interessant, en hersenstimulerend, uhm, ja. En programmeren in VB is geen van het bovenstaande (voor mij).
Tja, ik programmeer vooral met een doel voor me. Daarnaast vind ik het ook wel leuk om te doen hoor - maar met VB zal dat ook wel weer mee gaan vallen idd.... Maar het moet vooral functioneel zijn. Als ik leuke dingen wil doen doe ik die toch liever zonder de computer :)
Ik zou zelf ervoor kiezen om gewoon kleine tooltjes in Python te blijven schrijven, en dan een linkje naar de Python binaries neer te zetten. Het is toch niet jouw probleem als mensen te lui zijn om iets te installeren zodat je een handig tooltje kan gebruiken?
Ja, een tweaker zal dat niet zo'n probleem vinden, maar het is de bedoeling dat m'n moeder bijvoorbeeld ook met dat proggie overweg kan, dus dat gaat echt niet werken
madwizard schreef op 15 August 2003 @ 20:50:
[...]

Het programma zelf neemt vaak niet veel code in, het is vooral de runtimes die bij de meeste talen zitten. Zolang je die runtime niet gebruikt blijft je programma ook klein. Dat is niet in alle talen mogelijk, sommige zoals VB zitten gewoon erg vast aan de runtime libs.. VB programma's kunnen wel dynamisch gelinkt worden met de lib en dus heel klein zijn. Bij C++ programma's kan dat ook (msvcrt.dll enz.) maar C++ zit minder vast aan de libs. Je kan best een C++ programma schrijven dat puur van de windows API gebruik maakt en geen runtime library functies gebruikt. Dan kan je in een paar kb al een hoop doen. Cracks worden vaak ook in assembler gemaakt omdat daar vrijwel nooit runtimes gebruikt worden en dus meestal heel klein zijn, maar in C kan je meestal hetzelfde wel bereiken.
Ik denk dat ik C++ voorlopig nog even te heftig vind :)
PommeFritz schreef op 15 August 2003 @ 20:50:
Heb net met McMillan's Installer een single file executable van je programmatje gemaakt, die is 1,824,524 bytes groot geworden. Dat betekent dus dat de Python interpreter, en de benodigde libs, waaronder TCL/TK (GUI!) in een exe van minder dan 2 Mb zitten. Dat vind ik nogal meevallen!
Dat valt inderdaad nog te overzien!
Heb ook met py2exe een exe gemaakt, en de reden dat je zo veel files mee krijgt is omdat hij ook hier alle runtime files van TCL/TK (GUI!) er bij stopt!

Als je TCL/TK niet mee wilt 'linken' in de exe, dan zul je niet Tkinter moeten gebruiken voor je GUI. Kijk eens naar de win32 extensions voor Python, je kunt dan de native Windows API gebruiken (MessageBox enz). Maar je programmaatje werkt dan alleen op Windows natuurlijk.
Aah....da's ook nog een goeie. Daar zal ik eens naar kijken. Eventueel kan ik altijd nog twee versies maken.

  • PommeFritz
  • Registratie: Augustus 2001
  • Laatst online: 10-07 04:13

PommeFritz

...geen friet

Overigens, om de laatste bytes eruit te wringen: McMillan's installer heeft ingebouwde ondersteuning voor het packen van je executable met UPX.

FireFox - neem het web in eigen hand

Pagina: 1