Python SFTP 问题与套接字关闭 - 现有连接被远程主机强行关闭 (10054) - 如何继续?中断进程,

Python SFTP issue With Sockets Closing - An existing connection was forcibly closed by the remote host (10054) - How to continue? Breaks process,

所以我有一个过程,我将一系列目录和文件发送到服务。该服务处理这些文件,然后 returns 目录和输出文件到不同的目录

例如,将有一个名称为 运行 的父目录,然后是我们正在处理的每个日期的子目录。即:

输入

RunName

    2020-06-01
    2020-06-02
    2020-06-03

该服务在输出下为 运行 名称创建一个等效目录,然后在处理数据时创建相同的目录,因此当它处理第一个文件时,它看起来像这样:

输出

RunName

    2020-06-01
    
    

当服务处理完所有文件后,它会在目录中放置一个包含所有日期的“完成”文件。一旦收到完成文件,我的程序就可以进入下一阶段的处理。

我想做的是确定处理完成的百分比,然后确定何时完成。

除了一件事,下面的代码可以完美运行

我经常得到

错误:paramiko.transport:套接字异常:现有连接被远程主机强制关闭 (10054) 指向第二行(以“While”开头)

我需要进行哪些更改才能强制重新连接,然后在发生此错误时重试,并让 while 循环继续它的 metty 方式。

任何帮助将不胜感激..这让我很生气,因为它中断了一个更大的进程并导致积压。

srv = pysftp.Connection(host=servername, username=user,password=pwd,cnopts=cnopts)

while srv.isfile(donefile)==False:
    try:
        srv = pysftp.Connection(host=servername, username=user,password=pwd,cnopts=cnopts)
        dirnames=[]
        for i in srv.listdir(outputdir):
            if i[:6]=="date=2":
                dirnames.append(i)


        srv.close()
        if max(dirnames)!=lastname:
            print("Last Directory is: " ,max(dirnames), "out of", max(dirnamesin), " ",round((len(dirnames)/len(dirnamesin))*100), "pct done", datetime.datetime.now(), "run: ",run_name)
        lastname=max(dirnames)
        time.sleep(30)
        srv = pysftp.Connection(host=servername, username=user,password=pwd,cnopts=cnopts)
    except:
        print("connection error - will try again in 30 seconds")
        time.sleep(30)
        srv = pysftp.Connection(host=servername, username=user,password=pwd,cnopts=cnopts)
print ('done')

我会尝试重构它以确保正确关闭连接,例如

while True:
    try:
        with pysftp.Connection(host=servername, username=user,password=pwd,cnopts=cnopts) as srv:
            if srv.isfile(donefile):
                break
            dirnames=[]
            for i in srv.listdir(outputdir):
                if i[:6]=="date=2":
                    dirnames.append(i)
        if max(dirnames)!=lastname:
            print("Last Directory is: " ,max(dirnames), "out of", max(dirnamesin), " ",round((len(dirnames)/len(dirnamesin))*100), "pct done", datetime.datetime.now(), "run: ",run_name)
        lastname=max(dirnames)
    except Exception:
        print("connection error - will try again in 30 seconds")
    time.sleep(30)
print('done')