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

È stato utile?

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)

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top