2009-06-10 9 views
2

私はPythonプロジェクトに取り組んでいます。このプロジェクトには、新しいユーザーがシステムに慣れるための簡単なサンプルスクリプトが多数含まれています。各例のソースコードと同様に、私はテストマシンに出力を含めて、ユーザーはすべてがうまくいったら何を期待するかを知ることができます。リスト内のPythonスクリプトのセットを実行する

私はこれを単体テストの原型として使用することができました。すべてのサンプルスクリプトを自動的に実行し、予想される出力に対してdiffを実行します。

スクリプトは、拡張子で終わる私の例のすべてのように、私はそう

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

のようなもので簡単に十分な、ファイル名を取得することができますの.py、pythonfilesは[「example1.py」、「cool_example.py」のようなものが含まれています] 等々。

このリストで参照されているスクリプトを実際に実行するために使用できる構文は何ですか?

答えて

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が述べたように、サブプロセスを使用することもできます。 、あなたはPythonスクリプトとしてそれらをインポートすることができ

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

+1 doctestは喜びです! – SingleNegationElimination

3

彼らは同様に構成されている場合(すべて、例えば、実行機能で実行されている)、およびthier実行する関数を呼び出す:このような何かが動作します。

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) 
+0

これはサブプロセスよりも速いことに注意してください(ただし、Windowsを使用している場合を除き、その差はおそらく重要ではなく、実行するスクリプトがあまりない場合は問題ありません)。ただし、これはサブプロセスの解決策となるコール間でグローバル変数をリセットしません。彼らが両方の用途を持っているので、私は両方をアップ投票しています。 – user9876

関連する問題