WinPy2Exe - Ein grafisches Frontend

Du hast eine Idee für ein Projekt?
Antworten
Bernhard
User
Beiträge: 136
Registriert: Sonntag 15. Januar 2006, 20:31
Wohnort: Greifswald
Kontaktdaten:

Hallo Leute,
bevor ich mich hier mit einem py2exe-Problem gemeldet habe, habe ich in den alten Beiträgen gelesen, dass es bei vielen Fragen um ganz grundlegende Dinge geht. Zum Beispiel, dass mancher nicht weiß, wie man mit der Kommandozeile umgeht. Das ist unter Windows-Nutzern weit verbreitet. Statt auf die armen Fragenden einzuprügeln, wäre es doch viel einfacher, ihnen ein simples grafisches Frontend anzubieten.

Ich bin, wie andernorts erwähnt, selbst blutiger Anfänger. Daher poste ich hier einen simplen aber funktionierenden Entwurf. Verbesserungen und Erweiterungen kann jeder in diesem Thread posten.

Gruß,
Bernhard

Code: Alles auswählen

# -*- coding: cp1252 -*-
import sys
import os.path
import tkMessageBox
import tkFileDialog                                                           #Z. 5
from Tkinter import *
Begruessung="""Hallo !
Dieses Programm hilft Dir, py2exe auf Deine Python-
Programme anzuwenden:
1. Wähle im Dialog das Programm aus, das Du kompilieren möchtest.\n"""        #Z.10
fenster=Tk()
anzeige=Text(fenster, width=60, height=30)
anzeige.insert(END, Begruessung)
anzeige.pack()
programm=tkFileDialog.askopenfile()                                           #Z.15
if programm==None:   sys.exit(1)
userprog=programm.name
userdir=os.path.dirname(userprog)
os.chdir(userdir)
programm.close()                                                              #Z.20
# erstelle setup.py
anzeige.insert(END, '2. Ich erstelle eine Setup-Datei in Deinem Ordner.\n')
anzeige.pack()
setupfile=file(userdir+'/setup.py','w')                                       #Z.24
setupfile.write("""#Setup automatisch erstellt von WinPy2Exe
from distutils.core import setup
import py2exe
setup(options = {"py2exe": {"compressed": 1,
                            "optimize": 2,
                            "ascii": 1,
                            "bundle_files": 3}},\n
""")
console=tkMessageBox.askyesno("Mit Konsole?","""Soll Dein Programm ein \
Konsole-Fenster öffnen?
(z.B. für 'print' und 'input'. Im Zweifel immer 'Ja'""")                      #Z.35
rest=userprog+'"])'
if console==1:
    setupfile.write('console=["'+rest)
    anzeige.insert(END, '   Du willst ein Programm mit Konsole-Fenster\n')
    anzeige.pack()                                                            #Z.40
else:
    setupfile.write('windows=["'+rest)
    anzeige.insert(END, '   Du willst ein Programm ohne Konsole-Fenster\n')
    anzeige.pack()
setupfile.close()                                                             #Z.45
# erstelle Make.bat
anzeige.insert(END, '3. Erstelle make-Datei in Deinem Ordner\n')
anzeige.pack()
makefile=file(userdir+'/make.bat','w')
makefile.write(sys.exec_prefix+'\python -OO "'+userdir+'/setup.py" py2exe')   #Z.50
makefile.close()
# starte Make.bat
anzeige.insert(END,  "4. Ich rufe make auf\n")
anzeige.pack()
fehler=os.spawnl(os.P_WAIT,userdir+'/make.bat')                               #Z.55
if fehler!=0:
    print "Es hat mindestens einen Fehler gegeben. Schade!\n"+str(fehler)
else:
    print "Es müsste jetzt einen Ordner Dist geben, in dem eine selbständig lauffähige Version vorliegt"
[/code]
Pythonprog
User
Beiträge: 20
Registriert: Donnerstag 19. Januar 2006, 16:41

Hallo, ich kann ihnen zwar nicht sehr viel helfen aber eine Sache hätte ich

Code: Alles auswählen

from Tkinter import *
Daraus macht man um den Stil zu verbessern:

Code: Alles auswählen

import Tkinter as tk
Sonst könnte es nach meiner Erfahrung auch passieren, das Fehler verursacht werden, die schwer zu finden sind.
Ich glaube nicht ich konnte sehr weiter helfen aber es ist immerhin etwas
:-)
Benutzeravatar
jens
Python-Forum Veteran
Beiträge: 8502
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

Und noch ein allgemeiner Tipp.... Schreib nicht alles so runter, sondern Teile es ein ;)
Blöcke zusammen fassen in Funktionen, die du ganz unten, nach einander aufrufst... Das bring schon mal viel Übersicht :)

Die Idee ist allerdings nicht schlecht! Könnte wahrscheinlich einigen helfen! Ich hab mal schnell im Wiki von py2exe gesucht und spontan nichts gefunden, über ein Frontend...

GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
Bernhard
User
Beiträge: 136
Registriert: Sonntag 15. Januar 2006, 20:31
Wohnort: Greifswald
Kontaktdaten:

Hallo!
Ich hatte "alles nur runter geschrieben", um hier ein möglichst kurzes Skript vorzustellen. Der Programmverlauf ist ja sehr geradlinig. Aber wenn ich will, dass andere hieran mitarbeiten, sollte ich wohl etwas mehr Struktur hineinbringen. Zusammen mit der kleinen Erweiterung, dass der verwirrende und nach meinem bisherigen Kentnissstand überflüssige Ordner "build" jetzt gelöscht wird, sieht das Programm nun wie folgt aus:

Code: Alles auswählen

# -*- coding: cp1252 -*-
import sys
import os.path
import shutil
import tkMessageBox
import tkFileDialog                                                           
from Tkinter import *


class WinPy2Exe:
    def __init__(self):
        Begruessung="""Hallo !
Dieses Programm hilft Dir, py2exe auf Deine Python-
Programme anzuwenden:
1. Wähle im Dialog das Programm aus, das Du kompilieren möchtest.\n""" 
        self.fenster=Tk()
        self.anzeige=Text(self.fenster, width=60, height=30)
        self.schreibe(Begruessung)

    def schreibe(self, text):
        "Zur Ausgabe von Texten in das Fenster u/o die Konsole."
        self.anzeige.insert(END, text)
        self.anzeige.pack()
        print text
        
    def frage(self):
        "Erfragt Zielprogramm und führt userprog und userdir ein."
        programm=tkFileDialog.askopenfile()
        if programm==None:   sys.exit(1)
        global userprog
        userprog=programm.name
        global userdir
        userdir=os.path.dirname(userprog)
        os.chdir(userdir)
        programm.close()

    def schreibeSetupPy(self):
        self.schreibe('2. Ich erstelle eine Setup-Datei in Deinem Ordner.\n')
        setupfile=file(userdir+'/setup.py','w') 
        setupfile.write("""#Setup automatisch erstellt von WinPy2Exe
from distutils.core import setup
import py2exe
setup(options = {"py2exe": {"compressed": 1,
                            "optimize": 2,
                            "ascii": 1,
                            "bundle_files": 3}},\n
""")
        console=tkMessageBox.askyesno("Mit Konsole?","""Soll Dein Programm ein 
Konsole-Fenster öffnen?
(z.B. für 'print' und 'input'. Im Zweifel immer 'Ja'""")
        rest=userprog+'"])'
        if console==1:
            setupfile.write('console=["'+rest)
            self.schreibe('   Du willst ein Programm mit Konsole-Fenster.\n')
        else:
            setupfile.write('windows=["'+rest)
            self.schreibe('   Du willst ein Programm ohne Konsole-Fenster\n')
        setupfile.close()

    def schreibeUndStarteMake(self):
        self.schreibe('3. Erstelle make-Datei in Deinem Ordner\n')
        makefile=file(userdir+'/make.bat','w')
        makefile.write(sys.exec_prefix+'\python -OO "'+userdir+'/setup.py" py2exe')
        makefile.close()
        # starte Make.bat
        self.schreibe("4. Ich rufe make auf\n")
        fehler=os.spawnl(os.P_WAIT,userdir+'/make.bat')
        if fehler!=0:
            self.schreibe("Es hat mindestens einen Fehler gegeben. Schade!\n"+str(fehler))
        else:
            self.schreibe("Es müsste jetzt einen Ordner 'dist' geben, in dem eine selbständig\
 lauffähige Version vorliegt")

    def aufraeumen(self):
        shutil.rmtree(userdir+'/build') #den Ordner braucht man doch nicht
###

wpe=WinPy2Exe()                   #ruft __init__() auf
wpe.frage()                       #erfragt das umzuwandelnde Python-Programm
wpe.schreibeSetupPy()             #erstellt ein recht eintöniges setup.py
wpe.schreibeUndStarteMake()       #erstellt ein make.bat und ruft es auf
wpe.aufraeumen()                  #löscht den Ordner build
Ein Fehler steckt noch in der Ausgaberoutine "schreibe()" in Zeile 20 bis 23: Diese scheint bei den ersten beiden Aufrufen zu funktionieren und danach nicht mehr. Vielleicht kann das jemand lösen?
Ansonsten könnte man vielleicht eine etwas bessere Fehlerbehandlung machen und auf Wunsch zusätliche Dateien mit einbinden. Ihr seid alle herzlich aufgerufen, aus diesem Anfang was nützliches zu machen.

Gruß,
Bernhard
Benutzeravatar
jens
Python-Forum Veteran
Beiträge: 8502
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

Das sieht schon besser aus :)
Was aber noch ziemlich herraussticht, sind die Kommentare... Also die langen Zeilen...
Ich hab im Wiki mal eine Seite dafür angelegt, wie man es auch anders im Code machen kann: [wiki]Lange Zeilen im Sourcecode[/wiki]

GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
Francesco
User
Beiträge: 824
Registriert: Mittwoch 1. Dezember 2004, 12:35
Wohnort: Upper Austria

Hallo Bernhard,

zuerst einmal:
nette Idee dein Programm! 8)

Ich wollte als Test dein Programm selbst in eine Exe erstellen und bekam folgenden Traceback (in SciTE):

Code: Alles auswählen

Hallo !
Dieses Programm hilft Dir, py2exe auf Deine Python-
Programme anzuwenden:
1. Wähle im Dialog das Programm aus, das Du kompilieren möchtest.

2. Ich erstelle eine Setup-Datei in Deinem Ordner.

   Du willst ein Programm mit Konsole-Fenster.

3. Erstelle make-Datei in Deinem Ordner

4. Ich rufe make auf


C:\drpython\drpython_franz\saved\divsources>C:\Python24\python -OO "C:/drpython/drpython_franz/saved/divsources/setup.py" py2exe 
Es hat mindestens einen Fehler gegeben. Schade!
1
Traceback (most recent call last):
  File "winpy2exe.py", line 82, in ?
    wpe.aufraeumen()          
  File "winpy2exe.py", line 75, in aufraeumen
    shutil.rmtree(userdir+'/build') #den Ordner braucht man doch nicht
  File "C:\Python24\lib\shutil.py", line 151, in rmtree
    onerror(os.listdir, path, sys.exc_info())
  File "C:\Python24\lib\shutil.py", line 149, in rmtree
    names = os.listdir(path)
WindowsError: [Errno 3] Das System kann den angegebenen Pfad nicht finden: 'C:/drpython/drpython_franz/saved/divsources/build/*.*'
>Exit code: 1
Bernhard
User
Beiträge: 136
Registriert: Sonntag 15. Januar 2006, 20:31
Wohnort: Greifswald
Kontaktdaten:

Hallo!

@jens
Das mit den mehrzeiligen Strings hat mir auch nicht gefallen - Danke für den Link! Werde das in meinen Programmen zukünftig berücksichtigen.

@Francesco
WinPy2Exe auf sich selbst anzuwenden macht im Grunde natürlich wenig Sinn, aber auch ich habe das beim Entwickeln immer wieder gemacht. Das klappt bei mir sowohl aus IDLE heraus wie auch beim Doppelklicken auf das WinPy2Exe-Icon in Windows ohne Editor problemlos!

Ich kann allerdings Deine Fehlermeldung reproduzieren, wenn ich folgendes tue: Zunächst WinPy2Exe mit sich selbst kompilieren, dann das kompilierte WinPy2Exe.exe aufrufen und erneut auf WinPy2Exe.py hetzen. Das kann auch nicht gehen, denn dann versucht das kompilierte Exe sich selbst neu zu schreiben - und dann entsteht genau Deine Fehlermeldung. Probier doch mal, WinPy2Exe.py ohne Editor in Windows aufzurufen oder aus Scite auf ein anderes Skript und schreib, ob es dann funktioniert. Danke.

Ciao,
Bernhard
Benutzeravatar
jens
Python-Forum Veteran
Beiträge: 8502
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

Bernhard hat geschrieben:Das kann auch nicht gehen, denn dann versucht das kompilierte Exe sich selbst neu zu schreiben
Das ist ja auch klar, weil du eine laufende EXE überschreiben würdest, das kann nur schief gehen.

Ich würde allerdings mal überlegen, ob du andere Sachen einbaust, wie z.B. eine bessere Kompression mit 7-zip und UPX:

http://starship.python.net/crew/theller ... ompression

GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
Francesco
User
Beiträge: 824
Registriert: Mittwoch 1. Dezember 2004, 12:35
Wohnort: Upper Austria

Hallo,

ich habe jetzt folgendes gemacht (WinXP, Py 2.4):
winpy2exe ins root kopiert, meine Testdatei (TkText) auch:
in die Eingabeaufforderung gegangen, dann
python winpy2exe.py aufgerufen, das TkText ausgewählt.

Code: Alles auswählen

C:\>C:\Python24\python -OO "C://setup.py" py2exe
running py2exe
error: error in setup script: command 'py2exe' has no such option 'ascii'
Es hat mindestens einen Fehler gegeben. Schade!
1
Traceback (most recent call last):
  File "winpy2exe.py", line 82, in ?
    wpe.aufraeumen()
  File "winpy2exe.py", line 75, in aufraeumen
    shutil.rmtree(userdir+'/build') #den Ordner braucht man doch nicht
  File "C:\Python24\lib\shutil.py", line 151, in rmtree
    onerror(os.listdir, path, sys.exc_info())
  File "C:\Python24\lib\shutil.py", line 149, in rmtree
    names = os.listdir(path)
WindowsError: [Errno 3] Das System kann den angegebenen Pfad nicht finden: 'C://
build/*.*'
(Das TkText ist ganz was einfaches).
Setup.py wurde erstellt:

Code: Alles auswählen

#Setup automatisch erstellt von WinPy2Exe
from distutils.core import setup
import py2exe
setup(options = {"py2exe": {"compressed": 1,
                            "optimize": 2,
                            "ascii": 1,
                            "bundle_files": 3}},

console=["C:/TkText.py"])
und make.bat

Code: Alles auswählen

C:\Python24\python -OO "C://setup.py" py2exe
Das C://setup.py gefällt mir auch nicht (2 Slashes).

Wenn ich das make.bat so aufrufe:

Code: Alles auswählen

C:\>C:\Python24\python -OO "C://setup.py" py2exe
running py2exe
error: error in setup script: command 'py2exe' has no such option 'ascii'
py2exe Version:

Code: Alles auswählen

import py2exe
py2exe.__version__
'0.5.4'
Francesco
User
Beiträge: 824
Registriert: Mittwoch 1. Dezember 2004, 12:35
Wohnort: Upper Austria

aha, jetzt funktioniert es bei mir auch gut. :lol:

Ich habe mir die Version 0.6.3 von Py2Exe heruntergeladen und voila.

Vielleicht sollte man den Versionsstring abfragen, und den
Benutzer darauf hinweisen, dass er/sie mindestens auf version
x.y.z upgraden sollte.
Benutzeravatar
Windtommyhoff
User
Beiträge: 32
Registriert: Donnerstag 15. März 2007, 13:01
Kontaktdaten:

Das Programm gefällt mir gut. ist einfach und funktional. Besonders für mich als "Grade eine Woche Pythonianer" ist die Benutzerfreundlichkeit sehr willkommen!

Hab erstmal ne .exe davon gemacht! :wink:
Antworten