2013-06-17 2 views
0

Я создаю простой графический интерфейс для djv_converter: http://djv.sourceforge.net/documentation.html Он работает нормально, но мне не хватает обратной связи с этим приложением, когда я запускаю его с помощью Popen.Popen freeze/PySide GUI/cmd popup

args = [djv_path, newout, "%smov" % moviename,"-speed", speed ,"-scale", scale, "-save", "quicktime", "quality", quality, "-save", "quicktime", "codec", codec, "-channel", channel] 

child = subprocess.Popen(args,stdin=subprocess.PIPE, stdout=subprocess.PIPE, stderr=subprocess.PIPE) 

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

Проблема в том, что после завершения процесса происходит любой тип stdout. Похоже, что он зависает в момент создания дочернего процесса, а затем размораживается, когда это делается. Я пробовал оба с общаться и child.stdout.read и то же самое происходит.

Я запустил свой код python из файла bat, который вызывается из реестра, поэтому я могу использовать его под своим правом меню. GUI написан в PySide.

Я также не могу остановить всплывающее окно CMD, будь то файл pythonw и .pyw или модифицированный .bat-файл.

Если кто-нибудь знает, что может быть причиной проблемы, пожалуйста, дайте мне знать :)

Спасибо большое, KK

ответ

0

Вопрос заключается в том, что любой вид стандартный вывод происходит после того, как процесс законченный ,

subprocess.Popen не отображает STDOUT до тех пор, пока буфер не будет заполнен. В вашем случае буфер никогда не заполняется, поэтому ничего не отображается до завершения подпроцесса.

Я мог бы указать вам на эту тему с некоторыми предложенными рекомендациями: real time subprocess.Popen via stdout and PIPE

Ваш пробег может изменяться как ни одно из решений не казался волшебной пули для всех. Я лично обнаружил, что инструктаж subprocess.Popen, чтобы открыть небуферизованный Python, сделал трюк.

command = ["python", "-u", "python_file.py"] 
p = subprocess.Popen(command, stdout=subprocess.PIPE, stderr=subprocess.STDOUT) 

for line in iter(p.stdout.readline, ''): 
    line = line.replace('\r', '').replace('\n', '') 
    print line 
    sys.stdout.flush() 
+0

Большое спасибо за ответ. Я забыл добавить, что я попытался сбросить что-либо в stdout без успеха. Я также прошёл через поток, который вы рекомендовали, и ни один из методов не работает. Или, по крайней мере, они работают одинаково: поскольку внешняя программа завершается, я получаю свой результат, что не подходит для меня. Может ли это быть конкретное приложение, которое блокирует мое графическое приложение? Опять же, большое спасибо :) – krzykli

+0

@krzykli, вероятно, глупый вопрос, но когда вы запускаете свою программу из командной строки (не из подпроцесса.Popen, а непосредственно из командной строки), то она выводит вывод на терминал в в режиме реального времени? – ochawkeye

+0

Да, это так. Он показывает ход преобразования последовательности изображений в файл mov каждые 10% или около того. – krzykli