Я пытаюсь загрузить файл с FTP-сервера, используя код на Python. Однако при попытке загрузить файл я получаю сообщение об ошибке тайм-аута. Такое ощущение, что код создает локальный файл для записи, но затем сохранение этого файла открытым препятствует тому, чтобы код позже записывал в него и вызывал нарушение использования. Хотелось бы немного мыслей.
ftp = FTP_TLS(ftp_address)
ftp.login(ftp_user, ftp_pass)
ftp.prot_p()
ftp.cwd(ftp_directory)
def grabFile():
localfile = open(return_local_file, 'wb')
ftp.retrbinary('RETR ' + return_server_file, localfile.write, 1024)
ftp.quit()
localfile.close()
grabFile()
выдает ошибку:
---------------------------------------------------------------------------
TimeoutError Traceback (most recent call last)
<ipython-input-6-5e1e00b3e583> in <module>
13 localfile.close()
14
---> 15 grabFile()
<ipython-input-6-5e1e00b3e583> in grabFile()
8
9 localfile = open(return_local_file, 'wb')
---> 10 ftp.retrbinary('RETR ' + return_server_file, localfile.write, 1024)
11
12 ftp.quit()
C:\ProgramData\Anaconda3\lib\ftplib.py in retrbinary(self, cmd, callback, blocksize, rest)
440 """
441 self.voidcmd('TYPE I')
--> 442 with self.transfercmd(cmd, rest) as conn:
443 while 1:
444 data = conn.recv(blocksize)
C:\ProgramData\Anaconda3\lib\ftplib.py in transfercmd(self, cmd, rest)
397 def transfercmd(self, cmd, rest=None):
398 """Like ntransfercmd() but returns only the socket."""
--> 399 return self.ntransfercmd(cmd, rest)[0]
400
401 def login(self, user = '', passwd = '', acct = ''):
C:\ProgramData\Anaconda3\lib\ftplib.py in ntransfercmd(self, cmd, rest)
796
797 def ntransfercmd(self, cmd, rest=None):
--> 798 conn, size = FTP.ntransfercmd(self, cmd, rest)
799 if self._prot_p:
800 conn = self.context.wrap_socket(conn,
C:\ProgramData\Anaconda3\lib\ftplib.py in ntransfercmd(self, cmd, rest)
359 host, port = self.makepasv()
360 conn = socket.create_connection((host, port), self.timeout,
--> 361 source_address=self.source_address)
362 try:
363 if rest is not None:
C:\ProgramData\Anaconda3\lib\socket.py in create_connection(address, timeout, source_address)
725
726 if err is not None:
--> 727 raise err
728 else:
729 raise error("getaddrinfo returns an empty list")
C:\ProgramData\Anaconda3\lib\socket.py in create_connection(address, timeout, source_address)
714 if source_address:
715 sock.bind(source_address)
--> 716 sock.connect(sa)
717 # Break explicitly a reference cycle
718 err = None
TimeoutError: [WinError 10060] A connection attempt failed because the connected party did not properly respond after a period of time, or established connection failed because connected host has failed to respond
Тестирование с кодом:
from ftplib import FTP
ftp = FTP('kernel.org')
ftp.login()
ftp.cwd('/pub/linux/kernel')
ftp.set_pasv(True) # Default since Python 2.1
print(ftp.retrlines('LIST'))
print(ftp.retrbinary('RETR README', open('README', 'wb').write))
ftp.quit()
Ошибка выработки:
---------------------------------------------------------------------------
TimeoutError Traceback (most recent call last)
<ipython-input-5-8a5879ec21dd> in <module>
1 from ftplib import FTP
----> 2 ftp = FTP('kernel.org')
3 ftp.login()
4 ftp.cwd('/pub/linux/kernel')
5 ftp.set_pasv(True) # Default since Python 2.1
~\Anaconda3\lib\ftplib.py in __init__(self, host, user, passwd, acct, timeout, source_address)
115 self.timeout = timeout
116 if host:
--> 117 self.connect(host)
118 if user:
119 self.login(user, passwd, acct)
~\Anaconda3\lib\ftplib.py in connect(self, host, port, timeout, source_address)
150 self.source_address = source_address
151 self.sock = socket.create_connection((self.host, self.port), self.timeout,
--> 152 source_address=self.source_address)
153 self.af = self.sock.family
154 self.file = self.sock.makefile('r', encoding=self.encoding)
~\Anaconda3\lib\socket.py in create_connection(address, timeout, source_address)
725
726 if err is not None:
--> 727 raise err
728 else:
729 raise error("getaddrinfo returns an empty list")
~\Anaconda3\lib\socket.py in create_connection(address, timeout, source_address)
714 if source_address:
715 sock.bind(source_address)
--> 716 sock.connect(sa)
717 # Break explicitly a reference cycle
718 err = None
TimeoutError: [WinError 10060] A connection attempt failed because the connected party did not properly respond after a period of time, or established connection failed because connected host has failed to respond