2010-05-21 24 views
6

He desarrollado una aplicación Python que se ejecuta tanto en el modo GUI como en el modo de consola. Si se especifican los argumentos, se ejecuta en un modo de consola o se ejecuta en modo GUI.¿Cómo puedo congelar una aplicación de modo dual (GUI y consola) usando cx_Freeze?

He logrado congelar esto usando cx_Freeze. He tenido algunos problemas que ocultan la ventana de consola negro que aparecerá con wxPython y así he modificado mi guión setup.py así:

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 intento abrir mi consola y ejecutar el ejecutable desde allí, no produce nada. No recibo ningún error o mensaje, por lo que parece que cx_Feeze está redireccionando el estándar en otro lugar.

¿Es posible hacer que funcione con ambos modos? Nada similar a esto parece estar documentado en ninguna parte. :(.

Gracias de antemano

mridang

Respuesta

13

me encontré con este bit en this página:

Consejo para la versión de consola-menos: Si intenta imprimir nada, se le obtener una ventana de error desagradable, porque stdout y stderr no existen (y la cx_Freeze Win32gui.exe código auxiliar pantalla un error Ventana). Esto es un dolor cuando desea que su programa sea capaz de ejecutarse en modo GUI y modo de línea de comandos . Para desactivar de forma segura salida de la consola, haga lo siguiente en el comienzo de su programa:

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 programa se inicia en modo consola menos, que funcionará aunque si el el código contiene instrucciones de impresión. Y si se ejecuta en el modo de línea de comandos, se imprimirá como de costumbre. (Esto es básicamente lo que hice en webGobbler, también.)

+0

He puesto este fragmento en mi código, pero sigo recibiendo un error. Esto podría tener algo que ver con el uso de colorama en mi código, una biblioteca que genera texto en color. ¿Sabes cómo arreglar esto también? He agregado [una captura de pantalla] (http://i.imgur.com/1zVKo0c.png) para aclarar el error. Espero que puedas ayudarme. –

2

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

que había . sugerir envío dos ejecutables - CLI y una interfaz gráfica de usuario

+0

he encontrado una solución como el tipo mencionado en su puesto. Mira mi respuesta a continuación. –

Cuestiones relacionadas