Запуск набора скриптов Python в списке - PullRequest
2 голосов
/ 10 июня 2009

Я работаю над проектом Python, который включает в себя множество простых примеров сценариев, чтобы помочь новым пользователям привыкнуть к системе. Наряду с исходным кодом для каждого примера я включаю вывод, полученный на моей тестовой машине, чтобы пользователи знали, чего ожидать, когда все пойдет хорошо.

Мне пришло в голову, что я могу использовать это как грубую форму модульного тестирования. Автоматически запускать все примеры сценариев и загружать различия в зависимости от ожидаемого результата.

Все мои примеры сценариев заканчиваются расширением .py, поэтому я могу достаточно легко получить их имена с помощью чего-то вроде

pythonfiles=[filename for filename in os.listdir(source_directory) if filename[-3:]=='.py']

Итак, pythonfiles содержит что-то вроде ['example1.py', 'cool_example.py'] и т. Д.

Какой синтаксис я могу использовать для запуска сценариев, указанных в этом списке?

Ответы [ 3 ]

8 голосов
/ 10 июня 2009

Вы можете использовать doctest , чтобы помочь вам сделать это. Напишите метод, который выполняет каждый сценарий, и в строке документации для каждого метода вставьте ожидаемый результат:

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()

Примечание. Я не проверял это.

В качестве альтернативы, как упоминал Шейн, вы можете использовать подпроцесс. Примерно так будет работать:

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"
4 голосов
/ 10 июня 2009

Вы хотите использовать модуль подпроцесса .

3 голосов
/ 10 июня 2009

Если они имеют одинаковую структуру (например, все выполняются с помощью функции запуска), вы можете импортировать их как скрипты 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)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...