¿Cómo puedo congelar una aplicación de modo dual (GUI y consola) usando cx_Freeze?

He desarrollado una aplicación Python que se ejecuta tanto en el modo GUI como en el modo consola. Si se especifica algún argumento, se ejecuta en un modo de consola, de lo contrario se ejecuta en el modo GUI.

He logrado congelar esto usando cx_Freeze. Tuve algunos problemas al ocultar la ventana de la consola negra que se setup.py con wxPython y modifiqué mi script setup.py esta manera:

 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)]) 

Esto funciona bien, pero ahora cuando bash abrir mi consola y ejecutar el ejecutable desde allí, no genera nada. No recibo ningún error o mensaje, así que parece que cx_Feeze está redirigiendo la salida estándar a otro lugar.

¿Es posible que funcione con ambos modos? Nada parecido a esto parece estar documentado en ninguna parte. 🙁

Gracias por adelantado.

Mridang

Encontré este bit en esta página:

Sugerencia para la versión sin consola: si intenta imprimir algo, obtendrá una ventana de error desagradable, porque stdout y stderr no existen (y el código cx_freeze Win32gui.exe mostrará una ventana de error). Esto es un problema cuando desea que su progtwig pueda ejecutarse en modo GUI y modo de línea de comandos. Para deshabilitar con seguridad la salida de la consola, haga lo siguiente al principio de su progtwig:

 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() 

De esta manera, si el progtwig se inicia en modo sin consola, funcionará incluso si el código contiene instrucciones de impresión. Y si se ejecuta en modo de línea de comandos, se imprimirá como de costumbre. (Esto es básicamente lo que hice en webGobbler, también.)

Raymond Chen ha escrito sobre esto: http://blogs.msdn.com/b/oldnewthing/archive/2009/01/01/9259142.aspx . En resumen, no es posible directamente en Windows, pero hay algunas soluciones.

Yo sugeriría enviar dos ejecutables – cli y gui uno.