Come posso congelare un dual-mode (GUI e console) applicazione che utilizza cx_Freeze?
Domanda
Ho sviluppato un'applicazione Python che funziona sia in modalità GUI e la modalità console. Se vengono specificati argomenti, viene eseguito in una modalità console altrimenti viene eseguito in modalità GUI.
sono riuscito a congelare questo utilizzando cx_Freeze. Ho avuto qualche problema che nascondono la finestra della console nera che si solleva con wxPython e così ho modificato il mio script setup.py
in questo modo:
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)])
Questo funziona bene, ma ora quando provo ad aprire la mia console ed eseguire il file eseguibile da lì, non è così uscita nulla. Non capisco eventuali errori o messaggi così sembra che cx_Feeze reindirizza lo stdout da qualche altra parte.
Is è possibile farlo funzionare con entrambe le modalità? Nulla di simile a questo sembra essere documentata da nessuna parte. : (
Grazie in anticipo.
Mridang
Soluzione
Ho trovato questo bit su questa pagina :
Suggerimento per la versione console-meno: se Si tenta di stampare qualsiasi cosa, si vuole ottenere una finestra di errore brutto, perché stdout e stderr non esistono (e il cx_freeze Win32gui.exe stub volontà visualizzare una finestra di errore). Questo è un dolore quando si desidera che il programma sia in grado di funzionare in modalità GUI e modalità riga di comando. Per disabilitare in modo sicuro output della console, fare come segue agli all'inizio del programma:
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()
In questo modo, se il programma viene avviato in modalità console-less, funzionerà ancora se il codice contiene dichiarazioni di stampa. E se eseguito in modalità riga di comando, è stamperà come al solito. (Questo è in pratica quello che ho fatto in WebGobbler, troppo.)
Altri suggerimenti
Raymond Chen ha scritto su questo: http: //blogs.msdn.com/b/oldnewthing/archive/2009/01/01/9259142.aspx . In breve, non è possibile direttamente in Windows, ma ci sono alcune soluzioni.
Io suggerirei di spedizione due file eseguibili -. Uno cli e gui