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



假设一个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解释器在不同的系统上可能会被不同地调用。

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

最新更新