2011-08-17 4 views
2

Mac OS Xで実行されているpythonスクリプトがあります。これで、SVN作業コピーを指定された時刻に更新できるように変更する必要があります。しかし、私はSVNコマンドは、作業コピーを指定されたバージョンに更新することしかサポートしていないことを知りました。os.popen()を使用したときのPythonエラー

したがって、コマンドsvn log XXXの情報をgrubする関数を書いて、指定された時刻に対応するバージョンを探します。ここで私の解決策は次のとおりです。

process=os.popen('svn log XXX') 
print process.readline() 
print process.readline() 
process.close() 

問題を単純化するために、出力に最初の2行だけを印刷します。しかし、私がスクリプトを実行していたときに、次のエラーメッセージが表示されました。svn:書き込みエラー:壊れたパイプ

メッセージを受け取ったのは、Popenを閉じるときにsvnコマンドが実行を継続していたためです。したがって、エラーメッセージが表示されます。

問題を鎮めるのに役立つ人はいますか?または、私に目標を達成するための代替ソリューションを提供してください。どうも!

+0

代わりにpysvnの使用を検討しましたか? –

+0

また、 'os.popen'は' subprocess'に置き換えられました。 – TorelTwiddler

答えて

1

svn log | headを使用するたびにこのエラーが発生しますが、それはPython固有ではありません。 stderrを抑制するために

from subprocess import PIPE, Popen 

process = Popen('svn log XXX', stdout=PIPE, stderr=PIPE) 
print process.stdout.readline() 
print process.stdout.readline() 

:ような何かを試してみてください。

stdout, stderr = Popen('svn log XXX | head -n2', stdout=PIPE, stderr=PIPE, shell=True).communicate() 
print stdout 
1

pysvnを使用してください。それは非常に使いやすいです。または、サブプロセスを使用します。あなたはos.popenまたはサブプロセスを使用している場合

print process.read() 

そして、(待機を呼び出す方が良いです):

は、エラーまだあなたが最終的に行う場合に発生しました。

+0

Pythonでread()はファイルハンドルが閉じられるまですべての出力を読み込みます。サブプロセスがいくつかのバイトを書き込み、2時間待ってからもう一度いくつかのバイトを書き込んで存在すると、親プロセスがread()を実行すると、その時間全体が待機します。 – guettli

関連する問題