1

そのため、ファイルをダウンロードし、ダウンロードが完了しない場合は中断したところからダウンロードを再開するスクリプトを作成しています。その部分はお世話になっています。

機能しない部分だけを表示するために、これらのパーツをすべて取り出しました。ここにある amazon の URL は私が作成したばかりなので、これを実行しても実際には何もダウンロードされませんが、URL を実際のダウンロード リンクに置き換えると、次のようになります。

import urllib
import time
import os

file_name = "setup.exe"
web_page = urllib.FancyURLopener().open("https://s3.amazonaws.com/some_bucket/files/"+file_name)
while True:
    data = web_page.read(8192)
    if not data:
        print "done"
        break
    #print os.getcwd()
    with open(file_name, "ab") as outputFile:
        outputFile.write(data)
    #print "going..."
    #time.sleep(1)

何が起こるか (これは EXE ファイルをダウンロードしようとした場合のみ)、プロセスは web_page から一見ランダムな回数 (1 から 20 回の間) を読み取り、IOError: 13, Permission denied をスローします。繰り返しますが、.gif や .mov、または私がテストした他のいくつかのものでは、許可拒否エラーはスローされません。

さらに、time.sleep(1) 行のコメントを外すと、問題が解決します。with ステートメントが続行する前にファイルを完全に閉じていないかのようです。

with ステートメントは終了を処理するはずだと思っていましたよね?

また、おそらく現在のディレクトリが何らかの形で変更されているのではないかと思いましたが、コメントを外してもそれが明らかになることはありません(ただし、同じロジックでは、必ずしもそうする必要はありません)。

(また奇妙なのは、このスクリプトをデスクトップから実行して [デスクトップにも書き込むように] Aptana をその前に開いた場合、アクセス許可拒否エラーは発生しませんが、2 番目にテキスト エディターを最小化してデスクトップにフォーカスすると、エラーがスローされます-これは、Aptana が開いている間に多くのリソースを消費するため、他のプロセスが遅くなり、time.sleep のようなものになるためだと思います??)

ご指摘ありがとうございます。

4

1 に答える 1

1

ネットワークが読み取られるたびにファイルを再度開いたり閉じたりするのに苦労する理由がわかりません。Pavel が示唆するように、これにより、ウイルス スキャナーがファイルを開いて (そしてロックして) スキャンする機会が得られる可能性があります。一度開いて、すべての I/O を実行してから閉じてはどうでしょうか? (省略したコードと関係があると思います。)

それ以外の:

while True:
    data = web_page.read(8192)
    if not data:
        print "done"
        break
    with open(file_name, "ab") as outputFile:
        outputFile.write(data)

試す:

with open(file_name, "ab") as outputFile:
    while True:
        data = web_page.read(8192)
        if not data:
            print "done"
            break
        outputFile.write(data)
于 2013-01-24T18:48:12.313 に答える