套接字关闭的Python SFTP问题-远程主机强行关闭了现有连接10054-如何继续?中断流程

问题描述

因此,我有一个将一系列目录和文件提交给服务的过程。该服务将处理这些文件,然后将目录和输出文件返回到另一个目录

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

输入

RunName

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

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

输出

RunName

    2020-06-01
    
    

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

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

下面的代码可以完美地工作,除了一件事

我不断得到

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

我需要进行哪些更改以强制重新连接,然后在发生此错误时重试,并让while循环沿其持续时间继续。

任何帮助将不胜感激..这使我丧命,因为它打断了更大的进程并导致积压。

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

while srv.isfile(donefile)==False:
    try:
        srv = pysftp.Connection(host=servername,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,cnopts=cnopts)
    except:
        print("connection error - will try again in 30 seconds")
        time.sleep(30)
        srv = pysftp.Connection(host=servername,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')

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...