Frage

Ich habe eine Python-Anwendung entwickelt, die sowohl in dem GUI-Modus und die Konsolen-Modus läuft. Wenn alle Argumente angegeben sind, läuft es in einem Konsolenmodus sonst in dem GUI-Modus ausgeführt wird.

Ich habe es geschafft, dies mit cx_Freeze einzufrieren. Ich hatte ein paar Probleme, die die schwarze Konsole Fenster versteckt, die mit wxPython auftauchen würde und damit ich meine setup.py Skript wie folgt geändert:

import sys

from cx_Freeze import setup, Executable

base = None
if sys.platform == "win32":
    base = "Win32GUI"

setup(
        name = "simple_PyQt4",
        version = "0.1",
        description = "Sample cx_Freeze PyQt4 script",
        executables = [Executable("PyQt4app.py", base = base)])

Das funktioniert gut, aber jetzt, wenn ich versuche, meine Konsole zu öffnen und die ausführbare Datei von dort läuft, ist es nichts ausgibt. Ich erhalte keine Fehler oder Nachrichten so scheint es, dass cx_Feeze die stdout woanders wird umgeleitet wird.

Ist es möglich, es an der Arbeit mit beiden Modus zu bekommen? Nichts ähnlich wie dies scheint überall zu dokumentieren. : (

Vielen Dank im Voraus.

Mridang

War es hilfreich?

Lösung

Ich fand dieses Bit auf dieser Seite:

Tipp für die Konsole lose Version: Wenn Sie versuchen, etwas zu drucken, werden Sie erhalten einen bösen Fehler Fenster, weil stdout und stderr nicht existieren (und die cx_freeze Win32gui.exe Stub Willen Anzeigen eines Fehlerfensters). Das ist ein Schmerz, wenn Sie Ihr Programm sein wollen Lage im GUI-Modus laufen zu lassen und Befehlszeilenmodus. Um sicher zu deaktivieren Konsolausgabe, tun folgt wie bei der Beginn des Programms:

try:
    sys.stdout.write("\n")
    sys.stdout.flush()
except IOError:
    class dummyStream:
        ''' dummyStream behaves like a stream but does nothing. '''
        def __init__(self): pass
        def write(self,data): pass
        def read(self,data): pass
        def flush(self): pass
        def close(self): pass
    # and now redirect all default streams to this dummyStream:
    sys.stdout = dummyStream()
    sys.stderr = dummyStream()
    sys.stdin = dummyStream()
    sys.__stdout__ = dummyStream()
    sys.__stderr__ = dummyStream()
    sys.__stdin__ = dummyStream()

Auf diese Weise, wenn das Programm startet in Konsole loser Modus, wird es funktioniert auch wenn der Code enthält print-Anweisungen. Und wenn in Befehlszeilenmodus ausführen, es wird wie gewohnt ausdrucken. (Das ist im Grunde, was ich tat in webGobbler, auch.)

Andere Tipps

Raymond Chen hat darüber geschrieben: http: //blogs.msdn.com/b/oldnewthing/archive/2009/01/01/9259142.aspx . Kurz gesagt, es ist nicht möglich, direkt unter Windows, aber es gibt einige Workarounds.

Ich würde vorschlagen, Versand zwei ausführbare Dateien -. Cli und gui eines

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top