1

このコードを使用して、myfile.txt を Windows マシンから ftp サーバーにアップロードしています。アップロード後、スクリプトはローカル マシン上のファイルを削除します (ftp では削除しません)。

try:
    ftp = FTP(ftp.host.com)
    ftp.login(your_username, your_password)
    file = open(myfile.txt, "rb")
    ftp.storbinary('STOR myfile.txt', file)
    print 'STORing File now...'
    ftp.quit()
    file.close()
    subprocess.Popen('del myfile.txt', shell=True)
    print 'File deleted'
except all_errors:
    print 'An error occured'

このコードは実行されますが、信頼できません! 〜 10 回のアップロードごとに、ファイルの保存中にスクリプトがハングします。

print 'STORing File now...' # So I just get 'STORING File now...'

ファイルは大きくなく、数秒以内にアップロードする必要がありますが、多くの場合、1、2 時間待たなければならず、その後で例外がスローされます。

print 'An error occured'

例外が「以前に」スローされた場合は、アップロードを再開するだけでよいので (たとえば、while ループで)。このファイルをできるだけ早くアップロードする必要があるため、ファイルのアップロードを高速化する必要があります (例外がスローされるのをそれほど長く待ちたくありません)。

2 番目の問題: ファイルが正常にアップロードされた後、「他のプロセスが既にアクセスしている」ため、スクリプトはローカル マシン上のファイルの削除に失敗します <- ftplib がファイルを「解放」しなかったと思います。これを防ぐにはどうすればよいですか?

より優れた/信頼性の高いシンプルなファイルアップロードソリューションを探しています。誰にもアイデアがありますか?ありがとう!

4

3 に答える 3

2

サブプロセスを使用してファイルを削除しないでください - os.unlink 呼び出しを使用すると、これを移植可能に実行できます (os が失敗すると、shutil ライブラリがギャップを埋めます)。

今、あなたはばかげた print ステートメントでエラーを飲み込んでいます - 例外からトレースバックを取得すると、多数の手がかりが得られます。ただし、問題はソケットのタイムアウトの問題に関連している可能性があります。パッシブ FTP を実行していないか、サーバーの構成が正しくなく、無効なパッシブ接続ポート番号 (ファイアウォールによってブロックされているもの) が指定されています。

于 2010-01-13T17:04:00.317 に答える
1

例外を早期に取得するには、socket.setdefaulttimeoutを使用します。

import socket
socket.setdefaulttimeout(20.0)

ソケットが20秒間ブロックされた場合、例外が発生します。

Pyton スクリプトからファイルを削除するには、os.unlink を使用ますdel

于 2010-01-13T17:01:43.597 に答える