【问题标题】:Transferring files via Python's ftplib nondeterministically times out通过 Python ftplib 传输文件不确定超时
【发布时间】:2016-10-14 00:52:32
【问题描述】:

我正在尝试使用 ftplib 将一组文件从我的计算机(运行 64 位 Windows 7)传输到 Linux 服务器。过程类似于这个测试代码的sn-p(服务器地址,用户名和密码显然改变了):

import ftplib
import os.path
import os

host     = "some.ftp.server.com"
username = "username"
password = "password"

outDir = "/some/output/directory"

def transfer_files():
    ftp = ftplib.FTP(host, username, password)

    ftp.cwd(outDir)
    names = ftp.nlst()
    if "transferred" not in names:
        ftp.mkd("transferred")
    ftp.cwd("transferred")
    names = ftp.nlst()

    # Transfrer arbitrary files to the server
    filesToTransfer = os.listdir('.')
    for fName in filesToTransfer:
        if not os.path.isfile(fName):
            continue
        if fName in names:
            ftp.delete(fName)
        with open(fName, 'r') as f:
            ftp.storbinary("STOR %s" % fName, f)
        print fName

    ftp.quit()

    print "Done"

if __name__ == "__main__":
    transfer_files()

我看到的行为是大多数文件传输快速且成功,但随机文件会超时并引发以下异常:

Traceback (most recent call last):
  File "Test.py", line 37, in <module>
    transfer_files()
  File "Test.py", line 29, in transfer_files
    ftp.storbinary("STOR %s" % base, f)
  File "C:\Python27\Lib\ftplib.py", line 471, in storbinary
    conn = self.transfercmd(cmd, rest)
  File "C:\Python27\Lib\ftplib.py", line 376, in transfercmd
    return self.ntransfercmd(cmd, rest)[0]
  File "C:\Python27\Lib\ftplib.py", line 335, in ntransfercmd
    conn = socket.create_connection((host, port), self.timeout)
  File "C:\Python27\Lib\socket.py", line 575, in create_connection
    raise err
socket.error: [Errno 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

每次运行程序时超时的文件都不一样,但似乎总是发生在一个文件或另一个文件上。为什么传输会随机超时,我该怎么做才能防止这种情况发生?

【问题讨论】:

    标签: python ftp timeout ftplib


    【解决方案1】:

    在批量处理网络请求时,出现一定数量的超时是完全正常的,甚至是意料之中的。与其试图阻止超时发生(因为它们总是会发生),不如向应用程序添加逻辑以处理发生超时的情况。由于您正在批量上传文件,因此在引发异常时可能看起来像是重新尝试上传。

    【讨论】:

    • 将超时时间更改为 1 秒并重试传输直到成功似乎可行。当传输“随机”超时时,幕后发生了什么?
    • 每个网络请求都被分解成一系列通过网络(或 WiFi 或光纤电缆)传输的数据包。当您的计算机没有从另一端的计算机接收到它收到这些数据包的确认时,就会发生超时,或者是因为其中一些在去那里的路上丢失了,或者因为它的确认在返回的路上丢失了。在大多数情况下,计算机程序的行为“理想”,但数据传输会带来物理世界的所有缺陷,这些缺陷会妨碍数据的正确传输。
    猜你喜欢
    • 2021-04-09
    • 1970-01-01
    • 2011-03-27
    • 2022-01-02
    • 2023-03-14
    • 2020-04-07
    • 2012-07-19
    • 1970-01-01
    相关资源
    最近更新 更多