2011-10-24 20 views
9

Tengo un programa python con una GUI wxpython y algunos parámetros de línea de comandos. Genero un solo ejecutable de Windows con py2exe. No quiero tener una ventana de línea de comandos en segundo plano, por lo que py2exe está haciendo de este un ejecutable de pythonw sin esta ventana. Esto es equivalente a usar la extensión * .pyw.Cómo imprimir en stdout desde la secuencia de comandos de Python con la extensión .pyw?

El problema es que, si desea ver los argumentos de línea de comando disponibles, naturalmente hace "main.exe -h" en un shell. Aunque argparse proporciona esta información, no llega a la extensión estándar debido a la extensión * .pyw.

Entonces, ¿cómo podría volver a habilitar stdout para una aplicación de GUI utilizando pythonw?

ejemplo de trabajo mínima:

# test.py 
print "hello" 

ejecución:

#> python test.py 
hello 
#> pythonw test.py 
#> 

Gracias de antemano por cualquier sugerencia!

+1

relacionado: [Windows GUI + salida de consola, estilo Linux] (http://stackoverflow.com/questions/6673022/windows-gui-console-output-linux-style) – jfs

Respuesta

0

finalmente resuelto mi problema con algún tipo de una mala pasada. Obtengo la información de ayuda de argparse así:

class Parser(object): 
    def __init__(self): 
     [...init argparser...] 
     self.help = "" 
     self.__argparser.print_help(self) 
    def write(self, message): 
     self.help += message 

Luego, solo muestro la información de ayuda en el cuadro de diálogo Acerca de.

Todavía preferiría volver a habilitar sys.stdout, pero esto funciona por ahora. ¡Gracias a todas las sugerencias!

3

Una forma en que he hecho esto es usar el custom-boot-script de py2exe para redirigir sys.stdout a un archivo cuando hay un determinado cambio de línea de comando.

Voy a tener un código de muestra aquí cuando pueda desenterrarlo, pero consulte el enlace para comenzar.

+0

Gracias, pero preferiría obtener 'sys.stdout' de vuelta en la línea de comando. ¿Tienes una idea de cómo hacer eso? –

+1

Desafortunadamente, no creo que pueda hacer eso, ya que el subsistema de la consola no se inicializa con archivos .pyw. Tendría que hacer algunas cosas desagradables con las llamadas al API de Win32 AllocConsole para que su stdout vuelva a la ventana de la consola. – rossipedia

1

Puede indicarle a la instancia de la aplicación wxPython que redirija también. Sólo hay que establecer el parámetro "redirigir" True:

app = wx.App(True) 

Otra solución sería utilizar módulo de registro de Python en lugar de confiar en las cadenas de impresión a la salida estándar. Al usar eso, puede iniciar sesión en un archivo o en varios protocolos web, entre otros. Consulte la documentación para más detalles: http://docs.python.org/library/logging.html

También hay un buen tutorial introductorio aquí: http://www.doughellmann.com/PyMOTW/logging/

Cuestiones relacionadas