【问题标题】:Checking a Python FTP connection检查 Python FTP 连接
【发布时间】:2013-03-02 03:53:25
【问题描述】:

我有一个 FTP 连接,我从中下载许多文件并在它们之间进行处理。我希望能够检查我的 FTP 连接在两者之间没有超时。所以代码看起来像:

conn = FTP(host='blah')
conn.connect()
for item in list_of_items:
    myfile = open('filename', 'w')
    conn.retrbinary('stuff", myfile)
    ### do some parsing ###

如果在### do some parsing ### 行中超时,我如何检查我的 FTP 连接?

【问题讨论】:

    标签: python ftplib


    【解决方案1】:

    发送一个 NOOP 命令。这只会检查连接是否仍在进行中,如果您定期执行此操作,它可以保持连接处于活动状态。

    例如:

       conn.voidcmd("NOOP")
    

    如果连接出现问题,则 FTP 对象将抛出异常。从documentation可以看到,如果有错误,就会抛出异常:

    socket.error 和 IOError: 这些是由套接字连接引发的,很可能是您感兴趣的。

    exception ftplib.error_reply:从服务器收到意外回复时引发异常。

    exception ftplib.error_temp:当收到表示临时错误的错误代码(响应代码在 400–499 范围内)时引发异常。

    exception ftplib.error_perm:当收到表示永久错误的错误代码(响应代码在 500–599 范围内)时引发异常。

    exception ftplib.error_proto: 当从服务器收到不符合文件传输协议响应规范的回复时引发异常,即以 1-5 范围内的数字开头。

    因此,您可以使用try-catch block 来检测错误并进行相应处理。

    例如,这个代码示例将捕获一个 IOError,告诉你它然后重试操作:

    retry = True
    while (retry):
        try:
            conn = FTP('blah')
            conn.connect()
            for item in list_of_items:
                myfile = open('filename', 'w')
                conn.retrbinary('stuff', myfile)   
                ### do some parsing ###
    
            retry = False
    
        except IOError as e:
            print "I/O error({0}): {1}".format(e.errno, e.strerror)
            print "Retrying..."
            retry = True
    

    【讨论】:

    • ftplib 似乎不符合 Pythonic 原则,即应该有一种明显的方法来做某事——或者至少你必须在 voidcmd('NOOP') 上给我那个
    猜你喜欢
    • 1970-01-01
    • 2015-07-06
    • 2012-11-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-04-02
    相关资源
    最近更新 更多