2014-05-15 37 views
7

Bir komut dosyasını çağırmak için subprocess.Popen() kullanan bir uygulamayı sınamak için nose kullanıyorum. Bu betiğin çıktısını yakalamak için capture veya logcapture eklentisi görünmüyor. Bu çıkışı burnuna sokmanın kolay bir yolu var mı?Alt işlemin çıktısını yakalama.Popen() burun ile

Şimdiye kadar denediğim şey; note "Bana Yakalama" yakalanan değildir:

example.py:

if __name__ == '__main__': 
    print 'Capture me' 

test.py:

import subprocess 
import sys 


def test_popen(): 
    # nose's capture plugin replaces sys.stdout with a StringIO instance. 
    # subprocess.Popen() expects stdout to have a fileno property, which 
    # StringIO doesn't, so fake it. 
    sys.stdout.fileno = lambda: 1 

    subprocess.Popen(['python', 'example.py'], stdout=sys.stdout) 
    assert False # Force test to fail so we see nose output 

çıkış:

$ nosetests test.py 
F 
====================================================================== 
FAIL: test.test_popen 
---------------------------------------------------------------------- 
Traceback (most recent call last): 
    File "/Users/pmdarrow/Envs/example/lib/python2.7/site-packages/nose/case.py", line 197, in runTest 
    self.test(*self.arg) 
    File "/Users/pmdarrow/Code/example/API/test.py", line 8, in test_popen 
    assert False 
AssertionError 

---------------------------------------------------------------------- 
Ran 1 test in 0.004s 

FAILED (failures=1) 
Capture me 
+0

Özel "stdout" parametresi niçin 'sys.stdout' öğesine gönderiyor? Sen denedin mi? – Wolph

+0

Sadece Popen() 'i çıkışını burnuna göndermek için zorlama girişimiydi. Çıkış, o olmadan aynıdır. – pmdarrow

+0

alternatif olarak çıktı arıyorsanız, subprocess.check_output() ' –

cevap

0

Sen düşünebilirsiniz:

p = subprocess.Popen(['python', 'example.py'], stdout=subprocess.PIPE) 
q = p.communicate() 
output = q[0] 

alt işlemi daha fazla bilgi için communicate bakınız. Şerefe!

+0

Bunun benim problemimi çözdüğünden emin değilim. Bir senaryonun çıkışını nasıl yakalayacağımı sormuyorum, bu çıktının alınması için burnun nasıl alınacağını soruyorum ve test sonuçlarında güzel bir şekilde gösteriyorum. – pmdarrow

+0

iletişim ile elde etmek, bunu testinizde kullanmanıza olanak sağlayacaktır. Sonra istediğin her şeyi burnla yapabilirsin. Üzgünüm daha fazla yardım edemem, burnumda uzman değilim ... :(Ama testin geçmesine izin vermelisin! Şerefe! – abrunet

+0

Cevabınız için teşekkürler ama bir burun arıyorum Özel çözüm: – pmdarrow

3

Farkında olmanız gereken birkaç sorun var. Ben @arbunet cevabını tekrar ediyor olabilirim, ama benimle burada biraz çıplakım. İşte

import subprocess 
import sys 

def test_popen(): 
    p = subprocess.Popen(['python', 'example.py'], stdout=subprocess.PIPE) 
    out, err = p.communicate() 
    print out 

    assert False 

BORU baskı deyimini kullanarak stdout içine oluşturulur ve yönlendirilir: Eğer testin Stdout'a stdout'u süreç bitirmesini bekleyin ve süreci yönlendirmek Yani, her şey burun ile düzgün yakalanacaktır. Alternatif olarak, sys.__stdout__ (testin en güçlü olmayan sınaması) veya diğer dosya tanıtıcılarını Popen çağrısına geçirebilir ve daha sonra sys.stdout (burun tarafından oluşturulan StringIO.StringIO örneği) içine aktarabilirsiniz, ancak daha az temiz görünür (basit bir yöntemle karşılaştırıldığında) baskı bildirimi).

+0

İletişimi kullanmak oldukça işe yaramaz.P.stdout'tan * okuyan ve * sys.stdout * yazdığı bir iş parçacığı oluşturmalısınız. Aksi takdirde, yakalanan günlükler "son test" ile ilişkilendirilir ve gösterilmez. –

İlgili konular