8

Python を使用して SVN コミットを自動化しています。SVN コマンドの出力をログ ファイルに書き込みたいと考えています。私が持っているコードで SVN を実行できますが、問題は、コミットが成功すると、subprocess呼び出しがログの出力を返さないことです。

比較すると、手動で SVN を実行すると、コマンドの進行状況とコミットされているファイルを示す出力が得られます。それが私のログファイルに欲しいものです。SVN はそのデータを stdout または stderr よりもバッファに出力していますか? ログ用にそのデータを取得するにはどうすればよいですか?

私が使用しているコードは次のとおりです。

cmd = "svn commit --non-interactive --no-auth-cache -m 'Automatic commit' ./"
process = subprocess.Popen(cmd,
                           shell=True,
                           stdout=subprocess.PIPE,
                           stderr=subprocess.PIPE,
                           universal_newlines=True)
result = process.wait()

# Output
out = process.stdout.read()
err = process.stderr.read()

このコードを実行してコミットが成功すると、変数outerr変数は両方とも空になります。

4

2 に答える 2

11

wait()PIPE を使用している場合は使用しないでください。通信()を使用する

process = subprocess.Popen(cmd, shell=True, stdout=subprocess.PIPE,
          stderr=subprocess.PIPE, universal_newlines=True)

out, err = process.communicate()

サブプロセスのドキュメントから:

警告
.stdin.write、.stdout.read、または .stderr.read ではなく、communicate() を使用して、他の OS パイプ バッファがいっぱいになり、子プロセスがブロックされることによるデッドロックを回避します。

于 2012-05-02T00:37:28.250 に答える