Альтернатива жесткому кодированию exec интерпретатора Python во время unittest - PullRequest
0 голосов
/ 05 декабря 2018

Предположим, что unittest тест, в котором многострочный файл вывода генерируется с помощью скрипта Python (который использует argparse) и сравнивается равенство этого файла с ожидаемым результатом.

def test_actual_vs_expected_output(self):
    actual_inp = '/path_to/actu_inp.txt'
    expect_otp = '/path_to/expe_otp.txt'
    actual_otp = '/path_to/actu_otp.txt'
    myScript = '/path_to/myScript.py'
    cmd_list = ['python2', myScript,
                '-i', actual_inp,
                '-o', actual_otp]
    try:
        subprocess.check_output(' '.join(cmd_list), shell=True)
    except subprocess.CalledProcessError as e:
        print e.output
    if os.path.isfile(actual_otp):
        expect_str = open(expect_otp).read()
        actual_str = open(actual_otp).read()
    self.assertMultiLineEqual(expect_str, actual_str)

Как я могу избежать жесткого кодирования вызова python2 (т.е. в cmd_list приведенного выше примера)?В конце концов, интерпретатор Python2 может вызываться по-разному в разных системах.

1 Ответ

0 голосов
/ 06 декабря 2018

Для вызова Python в подпроцессе вы можете использовать текущий запущенный интерпретатор Python.Полный путь к этому интерпретатору задается глобальной переменной sys.executable .

Итак, вы можете написать:

import sys

cmd_list = [sys.executable, myScript,
            '-i', actual_inp,
            '-o', actual_otp]

Комментарий: Функция subprocess.check_output принимает список аргументов, поэтому вы можете передать параметр cmd_list как есть (вам не нужно присоединяться):

subprocess.check_output(cmd_list, shell=True)

Другой комментарий: Скрипт Python может записывать сообщения об ошибках в STDERR.Вы можете рассмотреть альтернативу check_output для получения сообщения об ошибке или использовать stderr=subprocess.STDOUT.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...