0

一部のファイルが欠落しているかどうかを確認し、wget 経由でダウンロードする python (2.7) スクリプトを作成しています。すべて正常に動作しますが、ダウンロードが完了してスクリプトが終了すると、bash (Python スクリプトを開始した場所) が正しく表示されません。カーソルがあり、入力できますが、標準のプロンプトが表示されません。プロンプトを正しく表示するには、ターミナル ウィンドウのサイズを変更する必要があります。この理由は何でしょうか?

tilenames = ['File1', 'File2', ...]
web_url = http://...

for t in tilenames:
    try:
        open(t, 'r')
    except IOError:
        print 'file %s not found.' % (t)
        command = ['wget', '-P', './SRTM/', web_url + t ]
        output = Popen(command, stdout=subprocess.PIPE)

print "Done"

wget プロセスの呼び出し方法に関係があると思います。wget がすべての出力をシェルに書き込む前に、最後のコマンドprint "Done"が実際に実行されます。

4

4 に答える 4

0

.communicate()次のように、後出力を追加するだけです。

tilenames = ['File1', 'File2', ...]
web_url = http://...

for t in tilenames:
    try:
        open(t, 'r')
    except IOError:
        print 'file %s not found.' % (t)
        command = ['wget', '-P', './SRTM/', web_url + t ]
        p = Popen(command, stdout=subprocess.PIPE)
        stdout, stderr = p.communicate()

print "Done"

communicate出力は stderr に転送されないため、stderr にstdout書き込まれたものを返します (代わりに端末に表示されます)。NonePIPE

ところで。開いているファイル オブジェクトを閉じる必要があります (ファイルが存在するかどうかを確認するには、os.pathの関数を使用できます (例: os.path.exists )) 。

于 2012-07-20T13:48:58.267 に答える
0

wget はその統計をstderrに書き込みます。これが端末をスクランブルする理由です。stdout と stderr は異なる間隔でフラッシュされ、照会されるため、Doneからの出力の前に表示される可能性がありますwget

修正は、で呼び出すかwget、または同様のものを使用し-qてリダイレクトすることです。stderrstderr=open("/dev/null", "w")

さらに、おそらく.communicate()パイプの問題を回避するために使用する必要があります。

于 2012-07-20T13:49:15.867 に答える
0

os.system を使用できます (ただし、http://docs.python.org/release/2.5.2/lib/node536.htmlを参照してください)。基本的に Popen は、Python プロセスがコマンド出力から読み取ることを許可することを目的としています。それを行う必要はないようですので、以下のフラグメントはあなたが望むものを得るはずです:

import os
import subprocess

p = subprocess.Popen(['wget','http://www.aol.com'],stdout=subprocess.PIPE)
os.waitpid(p.pid,0)
print "done"
于 2012-07-20T13:55:51.323 に答える