Вывод подпроцесса Python в Windows?

Я столкнулся с некоторыми трудностями при получении вывода из канала stdout подпроцесса. Я запускаю через него какой-то сторонний код, чтобы извлечь вывод журнала. До недавнего обновления стороннего кода все работало нормально. После обновления python начал блокироваться на неопределенный срок и фактически не отображал никаких результатов. Я могу вручную запустить стороннее приложение и посмотреть результат.

Базовая версия кода, который я использую:

import subprocess, time
from threading import Thread

def enqueue_output(out):
    print "Hello from enqueue_output"
    for line in iter(out.readline,''):
        line = line.rstrip("\r\n")
        print "Got %s" % line
    out.close()

proc = subprocess.Popen("third_party.exe", stdout=subprocess.PIPE, bufsize=1)
thread = Thread(target=enqueue_output, args=(proc.stdout,))
thread.daemon = True
thread.start()

time.sleep(30)

Это прекрасно работает, если я заменю сторонний _party.exe для этого скрипта:

import time, sys

while True:
    print "Test"
    sys.stdout.flush()
    time.sleep(1)

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

Это все варианты строки subprocess.Popen, которую я пробовал безуспешно:

proc = subprocess.Popen("third_party.exe", stdout=subprocess.PIPE, bufsize=0)
proc = subprocess.Popen("third_party.exe", stdout=subprocess.PIPE, shell=True)
proc = subprocess.Popen("third_party.exe", stdout=subprocess.PIPE, creationflags=subprocess.CREATE_NEW_CONSOLE)
si = subprocess.STARTUPINFO()
si.dwFlags = subprocess.STARTF_USESTDHANDLES | subprocess.STARTF_USESHOWWINDOW
proc = subprocess.Popen("third_party.exe", stdout=subprocess.PIPE, startupinfo=si)

Редактировать 1 :На самом деле я не могу использовать.communicate ()в этом случае. Приложение, которое я запускаю, продолжает работать в течение длительного периода времени (дней или недель ). Единственный способ протестировать.communicate ()— это убить приложение вскоре после его запуска, что, как мне кажется, не даст достоверных результатов.

Даже версия без резьбы -этого не работает:

import subprocess, time
from threading import Thread

proc = subprocess.Popen("third_party.exe", stdout=subprocess.PIPE, stderr=subprocess.PIPE)

print "App started, reading output..."
for line in iter(proc.stdout.readline,''):
    line = line.rstrip("\r\n")
    print "Got: %s" % line

Редактировать 2 :Благодаря jdi работает нормально:

import tempfile, time, subprocess

w = "test.txt"
f = open("test.txt","a")
p = subprocess.Popen("third_party.exe", shell=True, stdout=f,
                        stderr=subprocess.STDOUT, bufsize=0)

time.sleep(30)

with open("test.txt", 'r') as r:
    for line in r:
        print line
f.close()
5
задан devicenull 2 May 2012 в 02:23
поделиться