在单元测试期间可以替代对Python解释器exec进行硬编码的方法

时间:2018-12-05 20:40:37

标签: python python-2.7 unit-testing command-line

假设进行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 :(得分:1)

要在子进程中调用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