Sto provando a lanciare un 'rsync' usando il sottoprocesso modulo e Popen all'interno di una discussione. Dopo aver chiamato rsync, ho bisogno di leggere anche l'output. Sto usando il metodo di comunicazione per leggere l'output. Il codice funziona correttamente quando non utilizzo un thread. Sembra che quando uso un thread si blocca sulla chiamata di comunicazione. Un'altra cosa che ho notato è che quando ho impostato shell = False non ricevo nulla dalla comunicazione durante l'esecuzione in una discussione.Subprocesso Python.Popen da una discussione
21
A
risposta
33
Lei non ha fornito alcun codice per noi a guardare, ma qui è un campione che fa qualcosa di simile a ciò che si descrive:
import threading
import subprocess
class MyClass(threading.Thread):
def __init__(self):
self.stdout = None
self.stderr = None
threading.Thread.__init__(self)
def run(self):
p = subprocess.Popen('rsync -av /etc/passwd /tmp'.split(),
shell=False,
stdout=subprocess.PIPE,
stderr=subprocess.PIPE)
self.stdout, self.stderr = p.communicate()
myclass = MyClass()
myclass.start()
myclass.join()
print myclass.stdout
9
Ecco una grande implementazione non utilizza le discussioni: constantly-print-subprocess-output-while-process-is-running
import subprocess
def execute(command):
process = subprocess.Popen(command, shell=True, stdout=subprocess.PIPE, stderr=subprocess.STDOUT)
output = ''
# Poll process for new output until finished
for line in iter(process.stdout.readline, ""):
print line,
output += line
process.wait()
exitCode = process.returncode
if (exitCode == 0):
return output
else:
raise Exception(command, exitCode, output)
execute(['ping', 'localhost'])
+4
Va notato che questa implementazione verrà bloccata su 'process.stdout.readline()'. – Ian
Problemi correlati
- 1. subprocesso python.Popen nascondi vero "nome dispaly"
- 2. Stampa comando eseguito per subprocesso Python.Popen
- 3. Ottenere una discussione da Id
- 4. Utilizzo jolly subprocesso Python
- 5. Richiamata alla discussione principale da una Task
- 6. Crea una nuova discussione per aprire una nuova finestra e chiuderla da una discussione diversa
- 7. Variabile di accesso da un'altra classe da una discussione
- 8. pianificazione di una discussione dopo una discussione nell'applicazione iphone
- 9. Come fermare una discussione?
- 10. Come creare una discussione?
- 11. Arresto forzato di una discussione
- 12. Come chiudere una discussione dall'interno?
- 13. Interrompere una discussione in DatagramSocket.receive
- 14. Stream.parallel() usa una nuova discussione?
- 15. Determinazione dell'origine di una discussione
- 16. avvia un timer da una discussione diversa in C#
- 17. Divergenza in CUDA - uscita da una discussione nel kernel
- 18. Stampa di una traccia di stack da un'altra discussione
- 19. Arresto di un servizio Android da una discussione
- 20. log4net - confgure per ignorare i messaggi da una specifica discussione
- 21. Inserimento di un messaggio di pane tostato da una discussione
- 22. Come arrestare incondizionatamente una discussione
- 23. Modulo TopMost in una discussione?
- 24. Creare una discussione in UEFI
- 25. Task.WhenAll() - crea una nuova discussione?
- 26. Differenza tra una "coroutine" e una "discussione"?
- 27. Java - creazione di una nuova discussione
- 28. Tomcat crea una discussione per utente?
- 29. Impostazione di una discussione con bash
- 30. Creazione di una discussione in python
Sì, è esattamente ciò che sto facendo. Mi piacerebbe essere letto l'output all'interno del thread però. Dovrei anche notare che sto usando Python 2.3. Ho preso una copia del sottoprocesso dalla 2.4. – noahd
quindi si prega di contrassegnare come "risposta" –
Dovrei essere più chiaro che è quello che sto facendo, ma non funziona. In questo caso la chiamata di comunicazione non restituirà nulla e il comando non sembra essere eseguito. Se imposto shell = True la comunicazione blocca il thread. Poi, dopo aver fermato il pitone, ho finito con un processo ssh defunto. – noahd