Получение вывода из скрипта Python в тестах Python - PullRequest
0 голосов
/ 01 февраля 2012

У меня есть простой скрипт на python в файле bin / test:

#!/usr/bin/env python

import argparse

PROGRAM_NAME        = "name"
PROGRAM_VERSION     = "0.0.1"
PROGRAM_DESCRIPTION = "desc"
parser = argparse.ArgumentParser(prog=PROGRAM_NAME, description=PROGRAM_DESCRIPTION)
parser.add_argument('--version', action='version', version='%(prog)s ' + PROGRAM_VERSION)

args = parser.parse_args()

Когда я запускаю его с параметром --version или --help, он печатает все нормально:

$ bin/test --version
name 0.0.1

$ bin/test --help
usage: name [-h] [--version]

desc

optional arguments:
  -h, --help  show this help message and exit
  --version   show program's version number and exit

Когда я запускаю файл, используя subprocess.check_output, он ничего не получает:

>>> subprocess.check_output(["bin/test", "--help"],  stderr=subprocess.STDOUT, shell=True)
''
>>> subprocess.check_output(["bin/test", "--version"],  stderr=subprocess.STDOUT, shell=True)
''

Я использую Ubuntu 11.10 с версией Python:

python --version
Python 2.7.1+

Мне нужно получить вывод скрипта в тестах.Как мне это сделать?

1 Ответ

5 голосов
/ 01 февраля 2012

Если вы используете shell=True, не передавайте программу и ее аргументы в виде списка.Это работает:

subprocess.check_output("bin/test --help",  stderr=subprocess.STDOUT, shell=True)

Редактировать: конечно, оставить shell как False тоже сработало бы.

Редактировать2: документация объясняет, почему

В Unix с shell = True : Если args является строкой, это указывает командную строку для выполнения через оболочку.Это означает, что строка должна быть отформатирована точно так же, как при вводе в командной строке.Это включает, например, кавычки или обратную косую черту, экранирующие имена файлов с пробелами в них.Если args является последовательностью, первый элемент задает командную строку, и любые дополнительные элементы будут рассматриваться как дополнительные аргументы самой оболочки.

...