При использовании ftplib в Python 3.7, как правильно определить, закрыто или закрыто соединение ftp? - PullRequest
1 голос
/ 29 марта 2019

Исходя из документов и всех предыдущих вопросов SO, код здесь должен работать правильно, но это не так. Не удалось найти дубликаты. Если есть, то мой плохой.

Как правило, после вызова ftp.quit() на действующем ftp-соединении последующие попытки проверить, подключено ли оно, терпят неудачу. Выполнение блока try / исключением, указанного ниже, до ftp.quit() работает правильно («Соединение открыто» всегда печатается).

После закрытия соединения с помощью ftp.quit ():

1. Я пытался перехватить ошибки при вызове ftp.voidcmd('NOOP').

Я получаю ошибку Attribute: NoneType... (которая должна указывать на то, что объект ftp сброшен на Нет ).

2. Но проверка if ftp is None также не удалась.

3: И, просто для дополнительного подтверждения, я проверяю type(ftp)

Код для воспроизведения: (Результат следует)

# Connect
import ftplib
ftp = ftplib.FTP("FtpSite")
ftp.login("user","passwd")

# show success
print(ftp.getwelcome())

connected = True

# Close connection
ftp.quit()

# Is ftp still a valid obj?
print(type(ftp))

# Is ftp None?
if ftp is None:
    print("ftp is None.")
else:
    print("ftp is still assigned, but closed")


# check if open
try:
    ftp.voidcmd("NOOP")
except ftplib.all_errors as e:
    errorInfo = str(e).split(None, 1)[0]
    print(errorInfo)
    connected = False

if connected:
    print("Connection is open.")
else:
    print("Connection already closed.")

Результат:

<class 'ftplib.FTP'>  # the output of print(type(ftp))

ftp is still assigned, but closed  # the output of checking if None  

Traceback (most recent call last):  # the output of calling ftp.voidcmd()
  File "./dailyfetch.py", line 27, in <module>
    ftp.voidcmd("NOOP")
  File "C:\python37\lib\ftplib.py", line 277, in voidcmd
    self.putcmd(cmd)
  File "C:\python37\lib\ftplib.py", line 199, in putcmd
    self.putline(line)
  File "C:\python37\lib\ftplib.py", line 194, in putline
    self.sock.sendall(line.encode(self.encoding))
AttributeError: 'NoneType' object has no attribute 'sendall'

Смежные вопросы SO: Проверка FTP-соединения Python Как "проверить" NoneType в python?

Документы: https://docs.python.org/3/library/ftplib.html

...