Захват вывода подпроцесса. Открыть () с носом

Я использую нос, чтобы проверить приложение, которое использует subprocess.Popen() вызвать скрипт. Кажется, что ни плагин capture, ни logcapture не фиксируют вывод этого скрипта. Есть ли простой способ передать этот вывод в нос?

Вот то, что я пытался до сих пор; примечание "Поймай меня" не захвачено:

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

вывод:

$ 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

2 ответа

Есть несколько вопросов, которые вы должны знать. Возможно, я повторяю ответ @arbunet, но потерпите немного здесь. Поэтому, если вы дождетесь завершения процесса и перенаправите стандартный вывод процесса на стандартный тест, все будет правильно записано с помощью переноса:

import subprocess
import sys

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

    assert False

Здесь ТРУБА создается и перенаправляется в стандартный вывод с помощью оператора печати. В качестве альтернативы, вы можете передать sys.__stdout__ (unmolested stdout теста) или другой файловый дескриптор для вызова Popen, а затем сбрасывает его в sys.stdout (экземпляр StringIO.StringIO, созданный носом), но выглядит менее чистым (по сравнению с простым оператором print).

Вы могли бы рассмотреть:

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

Увидеть communicate Для получения дополнительной информации из подпроцесса. Ура!

Другие вопросы по тегам