2011-10-24 10 views
9

Ho un programma python con una GUI wxpython e alcuni parametri della riga di comando. Genero un singolo eseguibile di Windows con py2exe. Non voglio avere una finestra della riga di comando in background, quindi py2exe lo rende un eseguibile pythonw senza questa finestra. Questo è equivalente all'utilizzo dell'estensione * .pyw.Come stampare su stdout da script Python con estensione .pyw?

Il problema è che se si desidera visualizzare gli argomenti della riga di comando disponibili, si esegue naturalmente "main.exe -h" su una shell. Anche se argparse fornisce queste informazioni, non raggiunge lo stdout a causa dell'estensione * .pyw.

Quindi, come potrei riattivare lo stdout per un'applicazione GUI utilizzando pythonw?

minimo esempio di lavoro:

# test.py 
print "hello" 

esecuzione:

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

Grazie in anticipo per qualsiasi suggerimento!

+1

correlati: [Windows GUI + Console Output, stile Linux] (http://stackoverflow.com/questions/6673022/windows-gui-console-output-linux-style) – jfs

risposta

0

ho finalmente risolto il problema con qualche tipo di un brutto scherzo. Ottengo le informazioni di aiuto da argparse così:

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

Poi ho solo mostrare le informazioni di aiuto nella finestra di dialogo circa.

Preferirei comunque riattivare sys.stdout, ma questo funziona per ora. Grazie a tutti i suggerimenti!

3

Un modo in cui ho fatto questo è utilizzare py2exe custom-boot-script per reindirizzare sys.stdout in un file quando è presente un determinato interruttore della riga di comando.

Qui avrò un po 'di codice di esempio quando posso scavarlo, ma controlla il link per iniziare.

+0

Grazie, ma preferirei ottenere 'sys.stdout' indietro sulla riga di comando. Hai un'idea su come farlo? –

+1

Sfortunatamente, non penso che tu possa farlo, dal momento che il sottosistema della console non è inizializzato con i file .pyw. Dovresti fare alcune cose brutte con le chiamate AllocConsole dell'API Win32 per riportare lo stdout su una finestra della console. – rossipedia

1

Si può dire al reindirizzamento anche l'istanza di app di wxPython. Basta impostare il parametro "redirect" True:

app = wx.App(True) 

Un'altra soluzione sarebbe quella di utilizzare il modulo di registrazione di Python, invece di basarsi su stringhe di stampa sullo standard output. Usando questo, è possibile accedere a un file o a vari protocolli Web, tra gli altri. Vedere la documentazione per i dettagli: http://docs.python.org/library/logging.html

C'è anche un buon tutorial introduttivo qui: http://www.doughellmann.com/PyMOTW/logging/

Problemi correlati