cmd und cx_freeze

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
Yaso
User
Beiträge: 30
Registriert: Freitag 1. April 2011, 08:00

Hallo

Ich soll ein Skript schreiben, dass neben einem GUI einen "cmd" modus besitzt d.h. man sollte es auch ohne GUI nur mit Parameterübergabe bedienen könenn.
Dazu soll es auf Win PC's laufen, die kein Python installiert haben => muss es durch cx_freeze jagen.

Mein Problem besteht jedoch darin, dass wenn ich z.B. im cmd "test.exe" eingebe und das Programm nur aus der folgenden Zeile Besteht:

Code: Alles auswählen

import sys
if __name__ == '__main__':
    print >> sys.stdout, "hallo"
nichts im cmd erscheint, bzw. bei grösseren Programmen das cdm schon vor dem Python-Skript fertig ist.

Wie kann ich es machen, dass das cmd auf die Beendung des Skripts wartet und auch dessen Meldungen auf der Konsole ausgibt?

Danke
BlackJack

@Yaso: Es wird immer etwas ausgegeben, aber das Fenster der Eingabeaufforderung schliesst sich wenn das Programm zu ende ist und man kann die Ausgaben nicht mehr lesen.

Du musst das Programm in einer bereits offenen Eingabeaufforderung starten.
Yaso
User
Beiträge: 30
Registriert: Freitag 1. April 2011, 08:00

Ja, wenn mann die exe mit einem Doppelklick ausführt, aber ich habe ja die Eingabeaufforderung (cmd) offen und starte dort drinn die test.exe

Oder habe ich etwas übersehen?

Edit:
Hier noch das cx_freeze buildscript:

Code: Alles auswählen

from cx_Freeze import setup, Executable

includefiles = []
includes = []
excludes = []
packages = []

setup (
       name = "test",
       version = "1.0.0",
       options = {'build_exe': {'excludes':excludes,'packages':packages,'include_files':includefiles}}, 
       executables = [Executable("test.py",
                                 base = "Win32GUI"
                                 )])
Yaso
User
Beiträge: 30
Registriert: Freitag 1. April 2011, 08:00

Ok, habe gerade das "Problem" entdeckt.
Wenn man mit cx_freeze base = "Win32GUI" kompiliert funktieoniert das nicht, wenn man es weglässt gehts wunderbar. Leider Kommt dann beim GUI auch das Eingabefenster, welches ich eigentlich nicht möchte :?

Muss jetzt mir mal gedanken machen wie ich das überlisten kann...
jemand ne Idee?
Yaso
User
Beiträge: 30
Registriert: Freitag 1. April 2011, 08:00

So, habs nun so gelöst, dass ich beim cx_freeze-skript base = "Win32GUI" weggelassen habe und wenn die GUI anspringen soll verstecke ich die Cmd mit folgendem schnipsel:

Code: Alles auswählen

def hideCmd(self):
    toplist = []
    winlist = []
    def enum_callback(hwnd, results):
        winlist.append((hwnd, win32gui.GetWindowText(hwnd)))
        
    win32gui.EnumWindows(enum_callback, toplist)
    # just grab the first window that matches
    appCmd = [(hwnd, title) for hwnd, title in winlist if "test.exe" in title.lower()]
    appCmd = fwut[0]
    win32gui.ShowWindow(fwut[0], win32con.SW_HIDE)
(Habs von hier kopiert, verbesserungen und Anpassungen müssen noch gemacht werden aber es funktioniert)
Antworten