Исходя из документов и всех предыдущих вопросов 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