1

Unison を介して同期を自動化し、ログに記録する簡単なスクリプトを作成しようとしています。また、推奨されていないため、通常の os.system 呼び出しではなく subprocess.Popen を使用しています。過去 2 日間、ドキュメントなどを調べて何が間違っているのかを理解しようとしましたが、何らかの理由で端末から unison を呼び出しても問題はありませんが、Python から同じ呼び出しを行うと、ユーザーとのやり取りを試みます。さらに、出力の約半分をキャプチャしていませんが、もう一方はまだ端末に出力しています。

これが私が使用しようとしている私のコードです:

sync = Popen(["unison", "sync"], shell = True, stdout = PIPE)

for line in sync.stdout
    logFile.write(line)

sync.wait()

if sync.returncode == 0 or sync.returncode == None:
    logFile.write("Sync Completed Successfully\n")
else
    logFile.write("!! Sync Failed with a returncode of: " + str(sync.returncode) + "\n")

これが私のUnison設定ファイルです:

root = /home/zephyrxero/temp/
root = /home/zephyrxero/test/

auto = true
batch = true
prefer = newer
times = true
owner = true
group = true
retry = 2

私は何を間違っていますか?Unison からのすべての出力がログファイルに保存されないのはなぜですか? また、スクリプトの実行時に確認を求められるのに、ターミナルから単純に実行したときに確認が求められないのはなぜですか?

更新: OK、Emil のおかげで、すべての出力をキャプチャしていますが、「unison sync」とターミナルに入力すると、スクリプトから呼び出した場合とは異なる結果が得られる理由がまだわかりません。

4

2 に答える 2

1

最も可能性の高い原因は、unison が stdout だけでなく stderr に出力を送信していることです。Popen は追加のstderr引数を取るので、stdout の代わりに (または stdout に加えて) キャプチャすることができます)。

標準ストリームのクイック リファレンスについては、Wikipediaを参照してください。

于 2009-10-21T18:12:51.147 に答える
0

["unison", "sync"] を単に ["unison sync"] に変更しました...現在、ユーザーの操作を必要とせずに機能しているように見えますが、なぜ違うのかわかりません...しかし、私にとってはうまくいきます。

于 2009-10-21T18:40:29.007 に答える