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

StackOverflow https://stackoverflow.com/questions/2883205

  •  04-10-2019
  •  | 
  •  

Pregunta

He desarrollado una aplicación Python que funciona tanto en el modo de interfaz gráfica de usuario y el modo consola. Si no se especifica ningún argumento, se ejecuta en un modo de consola de lo contrario se ejecuta en el modo de interfaz gráfica de usuario.

Me las he arreglado para congelar esta 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 como esto:

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 ejecute el archivo ejecutable a partir de ahí, no hace nada de salida. No entiendo los errores o mensajes de lo que parece que cx_Feeze está redirigiendo la salida estándar en otro lugar.

Es es posible conseguir que funcione tanto con el modo? Nada parecido a esto parece estar documentado en ninguna parte. : (

Gracias de antemano.

mridang

¿Fue útil?

Solución

He encontrado este bit en esta página :

Un consejo para la versión de consola-menos: Si Intenta imprimir nada, se quiere obtener una ventana de error desagradable, porque stdout y stderr no existen (y la cx_Freeze Win32gui.exe voluntad trozo mostrar una ventana de error). Esto es un dolor cuando usted quiere que su programa sea capaz de funcionar en modo de interfaz gráfica de usuario y el 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 el modo de consola-menos, va a trabajar incluso Si el código contiene declaraciones de impresión. Y si se ejecuta en modo de línea de comandos, imprimirá como de costumbre. (Esto es básicamente lo que hice en webGobbler, también.)

Otros consejos

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.

Me gustaría sugerir el envío dos ejecutables -. Uno CLI y GUI

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top