1

UNIXコマンドをテストするために使用している次の方法がありますbc...式を受け取り、それを実行し、出力を返します...

def run_test(expr=""):

        try:
            process = sp.Popen('bc',
                               stdin=sp.PIPE,
                               stdout=sp.PIPE,
                               stderr=sp.PIPE)
            process.stdin.write(expr)
            result = process.stdout.readline()
            process.stdin.close()
            retval = process.wait()
            return result
        except Exception, e:
            print e


# correct expression, returns '4'
print run_test('2+2\n') 

ただし、間違った式を渡した場合はexpr、エラーを正しく処理したいので、そのテストケースexprが適切に失敗することをアサートできます...

#never stops
print run_test('2 / 0\n')

ただし、上記の式は決して返されません...たとえば、式が無効であることを示す値 false を返したいのですが、アサートすると、

assertTrue(run_test('2 / 0\n'), False) 

正しく動作します...どうすればそれを達成できますか?

4

2 に答える 2

1

何が起こっているかというと、stderr が適切にリダイレクトされていないということです。readline を実行しているときは、python プロンプトから次のコマンドを使用して、stderr を stdout にリダイレクトする必要があります。関数に移動する必要があります。

   def run_test(expr=""):

        try:
            process = sp.Popen('bc',
                               stdin=sp.PIPE,
                               stdout=sp.PIPE,
                               stderr=sp.STDOUT)
            process.stdin.write(expr)
            result = process.stdout.readline()
            process.stdin.close()
            retval = process.wait()
            return result
        except Exception, e:
            print e


# correct expression, returns '4'
print run_test('2+2\n') 

print run_test('2 / 0\n') # now this stops too

ドキュメントの説明: http://docs.python.org/2/library/subprocess.html Popen の stderr 引数として使用できる特別な値で、標準エラーを標準出力と同じハンドルに入れる必要があることを示します。

于 2013-10-24T13:36:39.653 に答える