ftplib в сочетании с os.unlink в python - PullRequest
3 голосов
/ 17 января 2010

С помощью следующего кода я загружаю файл file.txt на FTP-сервер. Когда файл загружен, я удаляю его на локальном компьютере.

import os
from ftplib import FTP

HOST = 'host.com'
FTP_NAME = 'username'
FTP_PASS = 'password'
filepath = 'C:\file.txt'
while True:
    try:
        ftp = FTP(HOST)
        ftp.login(FTP_NAME, FTP_PASS)
        file = open(filepath, 'r')
        ftp.storlines('STOR file.txt', file)
        ftp.quit()
        file.close() # from this point on the file should not be in use anymore
        print 'File uploaded, now deleting...'
    except all_errors as e: #EDIT: Got exception here 'timed out'
        print 'error'       #      then the upload restarted.
        print str(e)

os.unlink(filepath) # now delete the file

Код работает, но иногда (каждая ~ 10-я загрузка) я получаю это сообщение об ошибке:

Traceback (most recent call last):
in os.unlink(filepath)
WindowsError: [Error 32] The process cannot access the file
because it is being usedby another process: 'C:\file.txt'

То есть файл не может быть удален, потому что он не был выпущен или что-то еще? Я также попытался отсоединить файл следующим образом:

while True: # try to delete the file until it is deleted...
    try:
        os.unlink(filepath)
        break
    except all_errors as e:
        print 'Cannot delete the File. Will try it again...'
        print str(e)

Но при попытке "за исключением блока" я также получаю ту же ошибку "Процесс не может получить доступ к файлу, поскольку он используется другим процессом"! Скрипт даже не пытался напечатать исключение:

'Cannot delete the File. Will try it again...'

и просто остановился (как выше).

Как я могу заставить os.unlink правильно выполнять свою работу? Спасибо!

Ответы [ 3 ]

0 голосов
/ 17 января 2010

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

0 голосов
/ 18 января 2010

У меня все еще есть проблемы с кодом, он не такой надежный, как мне нужно. Например, возможно, что процесс входа не пройден. Возможно, пользователь + пароль неверен, возможно, sesrver занят.

try:
    ftp = FTP(HOST) # HOST is a valid host address
    ftp.login('test', 'test111111') # WRONG user + pass to test code robustness
    ftp.quit()
except all_errors as e:
    ftp.quit()
    print str(e)

Проблема заключается в ftp.quit () в блоке кроме. Python возвращает следующую ошибку (НЕ исключение):

Traceback (most recent call last):
    File "test.py", line 9, in <module>
        ftp.quit()
NameError: name 'ftp' is not defined
0 голосов
/ 17 января 2010
import os
from ftplib import FTP

HOST = 'host.com'
FTP_NAME = 'username'
FTP_PASS = 'password'
filepath = 'C:\file.txt'
file = open(filepath, 'r')
while True:
    try:
        ftp = FTP(HOST)
        ftp.login(FTP_NAME, FTP_PASS)        
        ftp.storlines('STOR file.txt', file)
    except all_errors as e: #EDIT: Got exception here 'timed out'
        print 'error'       #      then the upload restarted.
        print str(e)
    else:
        ftp.quit()
        file.close() # from this point on the file should not be in use anymore
        print 'File uploaded, now deleting...'   
        os.unlink(filepath) # now delete the file
        break
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...