2014-09-17 7 views
0

Я хотел бы запустить раздел кода, пока выполняется разветвленный подпроцесс (rsync). Это, как я сделал это в моем коде:Python - Выполнение кода до тех пор, пока выполняется подпроцесс

rsync_proc = subprocess.Popen(proc_args, stdout=subprocess.PIPE) 
while rsync_proc.poll() == None: 
      sys.stdout.write('\r'+ 
       rsync_progress_report(source_size_kb, dest, start)), 
      sys.stdout.flush() 
      time.sleep(1) 

По некоторым причинам, это приводит к тому, Rsync подпроцесс застрять, когда она почти закончена. Цикл while продолжает цикл с rsync_proc.poll(), возвращая None. Когда я запускаю этот же вызов rsync без кода цикла while, он заканчивается без проблем.

Заранее спасибо.

+1

'None' - одноэлементный; используйте 'is None' вместо' == None'. – jfs

+0

Спасибо! Не могли бы вы объяснить короткую разницу? –

+1

'is' сравнивает идентификаторы объектов. '==' - это свойство. Вы можете определить свой собственный собственный класс, который переопределяет метод '__eq__', чтобы его экземпляры были равны (' == ') на« Нет », но только« Нет »-« Нет ». – jfs

ответ

2

Если вы прикрепляете strace к вашему зацикленному процессу дочерних процессов rsync, вы, вероятно, увидите, что он заблокирован для записи на стандартный вывод.

Если он заблокирован для записи в стандартный вывод, это, вероятно, потому, что труба заполнена , потому что вы никогда не читали из нее.

Попробуйте прочитать трубку и просто отказаться от выхода - или, если вы действительно не хотите выхода, не подключайте его к трубе в первую очередь.

+0

Это может быть так, спасибо! Завтра попробуете на работе и сообщите, если это решит. –

+1

@YechielLabunskiy: что заставило вас использовать «PIPE» в первую очередь? Вы можете использовать 'DEVNULL', чтобы отменить вывод] (http://stackoverflow.com/a/11270665/4279). – jfs

Смежные вопросы