2014-05-15 15 views
7

Tôi đang sử dụng nose để kiểm tra ứng dụng sử dụng subprocess.Popen() để gọi tập lệnh. Không cần plugin capture hoặc logcapture để thu được đầu ra của tập lệnh này. Có cách nào dễ dàng để đưa đầu ra này vào mũi không?Ghi lại đầu ra của subprocess.Popen() bằng mũi

Đây là những gì tôi đã cố gắng cho đến thời điểm này; lưu ý "Chụp cho tôi" không chiếm được:

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 

đầu ra:

$ 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

Tại sao tham số 'stdout' tùy chỉnh nếu bạn gửi nó tới' sys.stdout' bằng cách nào? Bạn đã thử không? – Wolph

+0

Nó chỉ là một nỗ lực để buộc 'Popen()' để gửi đầu ra của nó để mũi. Đầu ra là như nhau mà không có nó. – pmdarrow

+0

cách khác, nếu bạn đang tìm đầu ra, hãy thử 'subprocess.check_output()' –

Trả lời

0

Bạn có thể xem xét:

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

Xem communicate để biết thêm thông tin từ quy trình con. Chúc mừng!

+0

Tôi không chắc chắn điều này giải quyết được vấn đề của tôi. Tôi không hỏi làm thế nào để nắm bắt đầu ra từ một kịch bản, tôi hỏi làm thế nào để có được mũi để nắm bắt đầu ra này và hiển thị nó độc đáo trong kết quả thử nghiệm. – pmdarrow

+0

làm cho nó với giao tiếp sẽ cho phép bạn sử dụng nó trong thử nghiệm của bạn. Sau đó, bạn có thể làm bất cứ điều gì bạn muốn với mũi. Tôi xin lỗi tôi không thể giúp đỡ nhiều hơn, tôi không có chuyên gia với mũi ... :(Nhưng nó sẽ cho phép bạn có bài kiểm tra của bạn để vượt qua! Chúc mừng! – abrunet

+0

Cảm ơn câu trả lời nhưng tôi đang tìm kiếm một mũi – pmdarrow

3

Có một số vấn đề bạn phải biết. Tôi có thể đang lặp lại câu trả lời @arbunet, nhưng với tôi một chút ở đây. Vì vậy, nếu bạn chờ đợi cho quá trình này kết thúc, và quá trình chuyển hướng stdout để stdout của kiểm tra, tất cả mọi thứ sẽ được chụp đúng với mũi:

import subprocess 
import sys 

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

    assert False 

Ở đây PIPE được tạo ra và chuyển hướng vào stdout sử dụng câu lệnh print. Ngoài ra, bạn có thể vượt qua trong sys.__stdout__ (stmout chưa được kiểm tra của thử nghiệm) hoặc bộ mô tả tệp khác cho cuộc gọi Popen và sau đó đưa nó vào sys.stdout (ví dụ StringIO.StringIO được tạo bằng mũi), nhưng có vẻ ít sạch hơn (so với đơn giản) báo cáo in).

+0

Sử dụng giao tiếp sẽ không hoạt động. Bạn cần tạo ra một luồng * đọc * từ tệp p.stdout và ghi vào * sys.stdout * Nếu không, các nhật ký đã ghi sẽ được liên kết với "thử nghiệm cuối cùng" và không hiển thị. –

Các vấn đề liên quan