我正在开发一个Python项目,其中包含许多简单的示例脚本,以帮助新用户习惯系统。除了每个示例的源代码之外,我还包括我在测试计算机上获得的输出,以便用户知道一切顺利时会发生什么。
我发现我可以将其用作单元测试的粗略形式。自动运行所有示例脚本,并针对预期输出执行大量差异。
我的所有示例脚本都以扩展名.py结尾,因此我可以轻松地使用类似
的文件名获取文件名pythonfiles=[filename for filename in os.listdir(source_directory) if filename[-3:]=='.py']
因此,pythonfiles包含类似['example1.py','cool_example.py']等内容。
我可以使用什么语法来实际运行此列表中引用的脚本?
答案 0 :(得分:8)
您可以利用doctest来帮助您完成此任务。编写一个执行每个脚本的方法,并在每个方法的docstring中粘贴预期的输出:
def run_example1():
"""
This is example number 1. Running it should give you the following output:
>>> run_example1()
"This is the output from example1.py"
"""
os.system('python example1.py') # or you could use subprocess here
if __name__ == "__main__":
import doctest
doctest.testmod()
注意我没有测试过这个。
或者,正如Shane所提到的,您可以使用子流程。这样的事情会起作用:
import subprocess
cmd = ('example1.py', 'any', 'more', 'arguments')
expected_out = """Your expected output of the script"""
exampleP = subprocess.Popen(cmd, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
out, err = exampleP.communicate() # out and err are stdout and stderr, respectively
if out != expected_out:
print "Output does not match"
答案 1 :(得分:4)
您想使用subprocess module。
答案 2 :(得分:3)
如果它们结构相似(例如,所有都以run函数执行),则可以将它们作为python脚本导入,并调用它们的运行函数。
import sys
import os
import imp
pythonfiles = [filename for filename in os.listdir(source_directory) if filename[-3:]=='.py']
for py_file in pythonfiles:
mod_name = os.path.splitext(py_file)[0]
py_filepath = os.path.join(source_directory, py_file)
py_mod = imp.load_source(mod_name, py_filepath)
if hasattr(py_mod, "run"):
py_mod.run()
else:
print '%s has no "run"' % (py_filepath)