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