Использование Python для загрузки файла через FTP - PullRequest
0 голосов
/ 10 октября 2019

Я пытаюсь загрузить файл с 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...