在列表中运行一组Python脚本

时间:2009-06-10 00:56:03

标签: python

我正在开发一个Python项目,其中包含许多简单的示例脚本,以帮助新用户习惯系统。除了每个示例的源代码之外,我还包括我在测试计算机上获得的输出,以便用户知道一切顺利时会发生什么。

我发现我可以将其用作单元测试的粗略形式。自动运行所有示例脚本,并针对预期输出执行大量差异。

我的所有示例脚本都以扩展名.py结尾,因此我可以轻松地使用类似

的文件名获取文件名
pythonfiles=[filename for filename in os.listdir(source_directory) if filename[-3:]=='.py']

因此,pythonfiles包含类似['example1.py','cool_example.py']等内容。

我可以使用什么语法来实际运行此列表中引用的脚本?

3 个答案:

答案 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)