Необходимо в несколько потоков с помощью python запускать cli приложение, которое выводит данные в stdout и stderr. Для каждого потока этот вывод нужно куда-то сохранить, хоть в переменную, хоть в файл. Пока что получилось создать несколько потоков, но к сожалению вывод идет вразнобой со всех запущенных потоков.
Могу предположить, что когда дело доходит до вызова os.wait, все дочерние процессы уже завершены. Цикл for line in iter(process.stdout.readline, "") фактически ждет завершения процесса.
def spawn(cmd, *args):
argv = [cmd] + list(args)
pid = None
global children
global processes
try:
process = subprocess.Popen(argv, stdout=subprocess.PIPE, stderr=subprocess.STDOUT)
pid = process.pid
children[pid] = {'pid': pid, 'cmd': argv}
processes[pid] = process
except Exception, inst:
print "'%s': %s" % ("".join(argv), str(inst))
return pid
... ... ... ...
while len(jobs) > 0 or len(children):
(pid, status) = os.wait()
output,error = processes[pid].communicate()
# print output
# print error
# print children[pid]['output']
del children[pid]
if len(children) < maxjobs and len(jobs):
cmd = jobs[0]
if spawn(*cmd):
del jobs[0]
Во время запуска получаю следующее:
Traceback (most recent call last):
File "./pycurl1.py", line 56, in ?
output,error = processes[pid].communicate()
File "/usr/lib64/python2.4/subprocess.py", line 1070, in communicate
self.wait()
File "/usr/lib64/python2.4/subprocess.py", line 1027, in wait
pid, sts = os.waitpid(self.pid, 0)
OSError: [Errno 10] No child processes
Результаты будут складываться последовательно по строкам. А нужно организовать для каждого процесса свою очередь, а по окончании работы последовательно выводить все данные.