[Python] thread e subprocess
Antonio Conte
barbone67 a gmail.com
Mer 29 Ott 2014 14:52:30 CET
salve a tutti,
sto lavorando su uno script che lancia su piu' client un comando. per il
momento sto usando subprocess, ma volevo lanciare i processi in parallelo
e ricavare l'output mano a mano che i processi terminano.
tenete conto che lo script va lanciato da cron, e mi serve l'output del comando
per inviarlo via mail.
dopo varie prove sono arrivato a questo, ma mi chiedevo se fosse il modo giusto
(cioe' l'utilizzo del contatore _act) per aspettare che tutti i processi
terminino e per leggere dalla queue l'output.
grazie in anticipo:
[CODE]
#!/usr/bin/env python2.7
#
import subprocess as sp
import threading as thr
try:
import queue
except ImportError:
import Queue as queue
def run_command(qq, args):
try:
_cmd = list(args)
_userid = _cmd[1]
_proc = sp.Popen(_cmd, stdout=sp.PIPE, stderr=sp.PIPE)
(_stdout, _stderr) = _proc.communicate()
qq.put(' *** %s ***\n\n[STDOUT]: %s\n[STDERR]: %s\n\n *** END ***\n\n' % (
_userid, _stdout, _stderr,))
except Exception as err:
log.error('errore %s: %s' % (_userid, str(err)))
qq.put(' *** %s ***\n\n[ERRORE]: %s\n\n *** END ***\n\n' % (
_userid, str(err),))
finally:
qq.task_done()
def run_unison(clients, qq, args):
_act = 0
for k, v in clients.items():
for scr in v['server']:
_cmd = [ 'ssh', '%s@%s' % (k, v['host'],),
'"/Users/%s/bin/%s_%s.command"' % (k, k, scr,) ] + _extra_params
t = thr.Thread(target=run_command, args=(qq, _cmd))
t.start()
_act += 1
print(' ')
while _act > 0:
_out_qq = qq.get()
print(_out_qq.decode('utf8'))
_act -= 1
if __name__ == '__main__':
qq = queue.Queue()
run_unison(_cli, qq, args)
[CODE]
--
Never try to teach a pig to sing.
It wastes your time and annoys the pig.
Maggiori informazioni sulla lista
Python