Копал в нескольких местах, но так и не нашёл чёткого решения проблемы. Итак, есть некая команда для запуска в шелле. Допустим, у меня она генерируется и помещается в переменную cmd. Затем я запускаю полученную команду, жду некоторое время, после чего мне нужно проверить, корректно ли запустилась эта команда, т.е. пуст ли поток вывода. Если он не пуст, мы выполняем одни действия, если всё хорошо, то соответственно другие. Логика проста.
# Запуск
cmd = subprocess.Popen(str(stcmd), shell=True, stdout=subprocess.PIPE, stdin=subprocess.PIPE, stderr=subprocess.PIPE)
# Затем я пытаюсь прочитать поток ошибок:
cmderr = cmd.stderr.read()
if cmderr:
print 'ERROR: ', cmderr
else:
print 'All is fine.'
Попытался сделать через communicate:
cmd = subprocess.Popen(str(stcmd+' &'), shell=True, stdout=subprocess.PIPE, stdin=subprocess.PIPE, stderr=subprocess.PIPE)
print 'test1'
cmdout, cmderr = cmd.communicate()
if cmderr:
self.__sql__('update vm set status = \'error\', error = \' CMDERROR: ' + str(cmderr) + '\' where vid = ' + str(id) + ';', 0)
return self.error('There are some error, while starting VM:\n' + cmderr)
print 'test2'
Насколько я читал, там ещё встаёт проблема буферизации по 4кб, т.е. пока буфер не наполнится, мы так же будем при чтении из пайпа ждать до посинения. Странно, что я с этой проблемой не столкнулся. Потому что при наличии данных в потоке вывода, я их получаю при read вне зависимости от их объёма, т.е. даже если вывод менее 1кб, по крайней мере с stderr.