2011-03-02 25 views
10

Bir program (HandBreakCLI) alt işlem olarak veya python 2.7 içinden iş parçacığı başlatmaya çalışıyorum. Başladığım kadarıyla anladım, ama stderr ve stdout'u nasıl izleyeceğimi anlayamıyorum.Bir alt işlemin stderr ve stdoutunu izleme Python

Program, sırasıyla stderr ve stdout kodlarının durumu (% yapıldı) durumunu ve kodlama hakkında bilgi verir. Periyodik olarak uygun akıştan yapılan% 'i almak istiyorum.

Alt işlem çağırma işlemini denedim.Popen, stipr ve stdout'u PIPE ile ve subprocess.communicate kullanarak ayarladı, ancak oturur ve işlem tamamlanana veya tamamlanana kadar bekler ve sonra çıktıyı alır. Beni çok iyi yapmaz.

Ben bir iş parçacığı olarak çalışıyorum ve var, ama hala altprocess.Popen programı yürütmek ve aynı duvara çalıştırmak için sonunda aramak zorunda söyleyebilirim.

Bunu doğru şekilde mi yapıyorum? Başka hangi seçeneklere sahibim veya bunu açıklandığı şekilde nasıl çalıştıracağım?

+0

'communication()' her zaman işlemin bitmesini bekler; doğrudan stderr'den okumak zorunda kalacaksınız. Bazı kodlar gönderir misiniz? – senderle

cevap

13

Aynı şeyi ffmpeg ile de başardım. Bu ilgili bölümlerin soyulmuş bir sürümüdür. bufsize=1, satır arabelleği anlamına gelir ve gerekli olmayabilir.

def Run(command): 
    proc = subprocess.Popen(command, bufsize=1, 
     stdout=subprocess.PIPE, stderr=subprocess.STDOUT, 
     universal_newlines=True) 
    return proc 

def Trace(proc): 
    while proc.poll() is None: 
     line = proc.stdout.readline() 
     if line: 
      # Process output here 
      print 'Read line', line 

proc = Run([ handbrakePath ] + allOptions) 
Trace(proc) 

Düzenleme 1: Ben hatları bu kullanmak sonra alt süreç (bu durumda el freni) (ffmpeg yapar) temizlemek gerektiğini fark ettim.

Düzenleme 2: Bazı hızlı sınamalar, bufsize=1'un aslında gerekli olmayabilir.

+0

OP varsayılan değer kullanmadığı sürece, bu arabellek satırına ayarlanmış olsa da, 'bufsize' seçeneğinin düşürülmesi, muhtemelen iyi bir fikirdir: "Bufsize için varsayılan değer 0'dır (arabelleğe alınmamış)." http://docs.python.org/library/subprocess.html – user470379

+0

Haklısınız, 1'e kadar bufsize ayarlamayı hatırlıyorum, bir anlamı ve etkisi vardı :) Düzenleme buna göre. Düzenleme 1 için –

+0

+1: "alt işlemin satırlardan sonra temizlenmesi gerekiyor". – db42

İlgili konular