Надежность STPlib STOR в Python?

1

Я использую этот код для загрузки myfile.txt с моей машины Windows на ftp-сервер. после загрузки script удаляет файл на моем локальном компьютере (я не удаляю его на 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-м загрузке мой script зависает во время хранения файла.

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

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

print 'An error occured'

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

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

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

  • 0
    Должен ли я выполнить загрузку всего файла с помощью ftp.exe Windows (вызываемого с помощью подпроцесса)?
Теги:
exception
file-upload
ftp
ftplib

3 ответа

2

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

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 есть свой собственный модуль удаления файлов. не вызывайте ненужную систему

2

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

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

  • 0
    так что с таймаутом сокета (Алекс Мартелли) я должен быть в состоянии справиться с проблемой. Спасибо!
1

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

import socket
socket.setdefaulttimeout(20.0)

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

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

  • 0
    спасибо за информацию os.unlink:> Итак, просто скопируйте / вставьте сокет для импорта кода; socket.setdefaulttimeout (20.0) это должно работать?
  • 0
    @creativz, если под «работой» вы подразумеваете «вызвать исключение, если сокет блокируется на 20 секунд», да, это именно то, что он должен делать.
Показать ещё 1 комментарий

Ещё вопросы

Сообщество Overcoder
Наверх
Меню