Надежность STPlib STOR в Python? - PullRequest
1 голос
/ 13 января 2010

Я использую этот код для загрузки 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...'

Файл не большой и должен быть загружен в течение нескольких секунд, но мне часто приходится ждать час или два, и только тогда выдается исключение:

print 'An error occured'

Если бы исключение было выдано «раньше», было бы неплохо, чтобы я мог просто возобновить загрузку (например, в цикле while). Поскольку мне нужно, чтобы этот файл был загружен как можно скорее, мне нужно ускорить загрузку файла (я не хочу ждать так долго, пока генерируется исключение)

Вторая проблема: иногда это происходит: после успешной загрузки файла сценарий не может удалить файл на моей локальной машине, потому что «какой-то другой процесс уже обращается к нему» <- я думаю, что ftplib не «выпустил» файл. Что я могу сделать, чтобы предотвратить это? </p>

Я ищу лучшее / надежное простое решение для загрузки файлов. У кого-нибудь есть идея? Спасибо!

Ответы [ 3 ]

2 голосов
/ 13 января 2010

Не используйте подпроцесс для оболочки для удаления файла - вызов os.unlink позволит вам сделать это переносимо (библиотека shutil заполняет пробелы при сбое os)

Прямо сейчас, вы поглощаете ошибку с помощью своего глупого оператора печати - получите ответный сигнал от исключения, которое даст вам большое количество подсказок. Тем не менее, ваша проблема, вероятно, связана с проблемами тайм-аута сокета - либо вы не используете пассивный FTP, либо сервер неправильно настроен и дал вам неверный номер порта пассивного подключения (что-то блокирует брандмауэр).

2 голосов
/ 13 января 2010

как насчет этого

def upload(ftp, filename):
    ftp.storbinary("STOR " + filename, open(filename, "rb"), 1024)
try:
    ftp = FTP("ftp.host.com")
    ftp.login(your_username, your_password)
except Exception,e:
    print e
else:
    file = open("myfile.txt", "rb")
    print 'STORing File now...'
    try:
        upload(ftp,file)
    except Exception,e:
        print e
    else:
        ftp.quit()
        file.close()
        try:
            os.remove("myfile.txt")
        except Exception,e:
            print e
        else:
            print 'File deleted'

Помните, у Python есть свой собственный модуль удаления файлов.не вызывайте system del без необходимости

1 голос
/ 13 января 2010

Чтобы получить исключение раньше, используйте socket.setdefaulttimeout : например,

import socket
socket.setdefaulttimeout(20.0)

даст вам исключение, если сокет заблокирован на 20 секунд.

Чтобы удалить файл из скрипта Pyton, используйте os.unlink - намного лучше, чем выделять отдельный процесс для del.

...