1

いくつかの Python パッケージ (*) を含む大規模なリポジトリがあります。プロジェクトのルートからではなく、各サブディレクトリでpy.testを実行するようにscons を設定します。これはかなり苛立たしいことです。現在、すべてのエラーチェックが削除されたこのアクションがあります。

def runTests (target = None, source = None, env = None):
    cmd = which(env['TEST_RUNNER'])
    if cmd:
        retCode = True
        for path in env['TEST_DIR_LIST']:
            print 'Doing directory %s:' % (path)
            retCode = retCode and subprocess.call([cmd], cwd=path)
        env.Exit(retCode)

ファイルのように呼び出しSConstructます:

runTestsCmd = env.Command('runTests', None, Action(runTests, "Running tests"))
AlwaysBuild(runTestsCmd)
Alias('test', runTestsCmd)

そして、各SConscriptファイルには次のものがあります。

env.Append(TEST_DIR_LIST = ['PackageDirectory'])

私が得るのは、py.test のインスタンスが 1 つだけ実行されるということです。「Doing directory X」メッセージは表示されますが、py.test は実行されません。

明らかに、SConscript で環境を複製しない必要があるか、env が複製されている場合は、TEST_DIR_LIST への追加が元の環境で確実に行われるようにする必要があります。

だから、私の質問は2つあります:

  1. これは私がやりたいことをする賢明な方法ですか?
  2. もしそうなら、私は何を間違っていますか? そうでない場合は、どうすればよいですか?

(*)はい、これを変更することを検討しています。いいえ、すぐには実現しないので、上記が必要です。

4

1 に答える 1

1

問題は次の行です。

retCode = retCode and subprocess.call([cmd], cwd=path)

subprocess.callFalse成功すると 0 (これは に評価されます) を返します。を挿入するnotか、次のような適切なチェックを行う必要があります。

retcode = subprocess.call([cmd], cwd=path)
if retcode != 0:
     print ("failed ...")
     break  # or not break if you want to continue anyway
于 2012-11-23T08:09:05.723 に答える