Python wx (Python Card) registra l'output del sottoprocesso nella finestra
-
05-07-2019 - |
Domanda
Esistono simili questions a questo, ma mi piacerebbe vedere una risposta chiarita. Sto creando una semplice GUI con PythonCard per concludere un processo da riga di comando. In particolare, è un wrapper per una serie di attività ANT e altre operazioni personalizzate in modo che i non sviluppatori possano usarlo.
Vorrei reindirizzare l'output del sottoprocesso a un TextArea nella finestra. Sembra che il modo per farlo sia usare subprocess.Popen (comando, stdout = subprocess.PIPE)
e caricare l'output in una variabile.
La domanda è: come posso aggiornare la finestra con l'output del sottoprocesso? Eventuali suggerimenti sarebbero ben accetti
Grazie
Soluzione
Quasi tutti i sottoprocessi che puoi avvolgere bufferizzeranno il suo output a meno che tu non riesca a ingannarlo nel credere che sia effettivamente collegato a un terminale - e il sottoprocesso non può farlo. Piuttosto, guarda pexpect (funziona bene su ogni piattaforma che ti consente di avere uno pseudoterminale, ad esempio, ogni piattaforma tranne Microsoft Windows; su Windows potresti provare wexpect ma Non ho esperienza con quest'ultimo).
Questi moduli ti danno l'output del sottoprocesso non appena viene prodotto e si sforzano di ingannare il modulo per produrre quell'output il più presto possibile e senza buffering, quindi dovrebbero renderti facile ricevere quell'output in tempo reale e aggiungerlo a il campo di testo che si desidera aggiornare.
Altri suggerimenti
Stavo cercando una soluzione anche per questo. Si scopre che la soluzione è straordinariamente semplice:
proc = subprocess.Popen (" qualunque sia il programma " ;, cwd = " startup dir " ;, shell = True,
stdout = subprocess.PIPE, stderr = subprocess.STDOUT)
mentre vero:
txt = proc.stdout.readline ()
se non txt: rompere
txt = txt.replace (" \ r \ n " " \ n ") sostituire. (" \ r \ n " " \ n "). sostituire (" \\ " " \ ")
self.components.taStdout.appendText (txt)