提问者:小点点

Python最大递归深度超过了仅在. exe中编译后获取Sharepoint元数据


我编写了一个连接到Sharepoint的脚本,并从添加到数据框中的所有新文件中下载元数据。

我在Spyder中开发了它,它工作得很好。但是在我使用pyinstall er将其编译成. exe文件并运行它之后,我一直收到以下错误:超过最大递归深度

我正在使用Windows10和Python3.6.10(conda)

from office365.runtime.auth.clientCredential import ClientCredential
from office365.sharepoint.client_context import ClientContext

import pandas as pd

clien_id = XXX
cient_secret = XXX
site_url = XXX

ctx = ClientContext.connect_with_credentials(site_url, ClientCredential(client_id, client_secret))

lib = ctx.web.lists.get_by_title("REO")

doc = 1

while cuenta_error < 10:
                    try: 
                        item = lib.get_item_by_id(doc)
                        ctx.load(item)
                        ctx.execute_query()
                        id_documento = "{0}".format(item.properties["IdDocumentoSistemaOrigen"])
                        id_sharepoint = "{0}".format(item.properties["Id"])
                        ts_alta = datetime.strptime(str(datetime.now()), '%Y-%m-%d %H:%M:%S.%f').strftime('%Y-%m-%d %H:%M:%S')
                        origen = "{0}".format(item.properties["AplicacionOrigen"])
                        tipo_doc_SH = "{0}".format(item.properties["TipoDocumento"]['Label'])
                        fecha_alta_origen = datetime.strptime("{0}".format(item.properties["Created"])[0:10], '%Y-%m-%d').strftime('%Y-%m-%d')
                        id_inmueble = "{0}".format(item.properties["IdActivoPrinex"])
                        dni = "{0}".format(item.properties["NumeroIdentificacion"])
                        id_promocion = "{0}".format(item.properties["CodigoPromocion"])
                        file = item.file
                        ctx.load(file)
                        ctx.execute_query()
                        nombre_documento = "{0}".format(file.properties["Name"])
                        fecha_envio = None
                        IAObjeto = None
                        #print(id_documento)
                        doc +=1
                        cuenta_error = 0
                        fecha_envio = None
                        ind_error = None
                        to_append = [id_documento, id_sharepoint, tipo_documento, ts_alta, nombre_documento,
                                origen, tipo_doc_SH, fecha_alta_origen, id_inmueble, fecha_envio, ind_error,dni, id_promocion, IAObjeto]
                        a_series = pd.Series(to_append, index = df.columns)
                        df = df.append(a_series, ignore_index=True)
                        export_doc +=1
                    except Exception as e:
                        print(e)

我尝试过sys. setpostsionlimited(1500),但我仍然收到相同的错误,并且使用sys.setpostsionlimited(1000**6)代码最终崩溃。

有人对如何解决这个问题有什么建议吗?


共1个答案

匿名用户

早安

最后我想出了问题所在

ClientContext以递归方式工作,在几次调用后粉碎,

我编辑了我的代码,因此每次调用新项目时都会调用上下文,现在它正在工作。

我创建了两个函数,每次我想从每个文件中获取元数据时我都会调用它们。使用此函数,我关闭上下文并在每次调用后再次打开它,可能不是最好的方法,但我用完了想法和这项工作。

from office365.runtime.auth.client_credential import ClientCredential
from office365.sharepoint.client_context import ClientContext
import pandas as pd
from datetime import datetime, date

def call_lib(site_url,client_id, client_secret,serv):
    ctx = ClientContext.connect_with_credentials(site_url, ClientCredential(client_id, client_secret))
    if serv == 'PRN':
        lib = ctx.web.lists.get_by_title("REO")
    elif serv == 'GIA':
        lib = ctx.web.lists.get_by_title("DESINVERSIÓN") 
    return ctx, lib

def get_metadata_from_sh (ctx,lib,docnum):
     item = lib.get_item_by_id(docnum)
     ctx.load(item)
     ctx.execute_query()
     id_documento = "{0}".format(item.properties["IdDocumentoSistemaOrigen"])
     id_sharepoint = "{0}".format(item.properties["Id"])
     ts_alta = datetime.strptime(str(datetime.now()), '%Y-%m-%d %H:%M:%S.%f').strftime('%Y-%m-%d %H:%M:%S')
     origen = "{0}".format(item.properties["AplicacionOrigen"])
     tipo_doc_SH = "{0}".format(item.properties["TipoDocumento"]['Label'])
     fecha_alta_origen = datetime.strptime("{0}".format(item.properties["Created"])[0:10], '%Y-%m-%d').strftime('%Y-%m-%d')
     id_inmueble = "{0}".format(item.properties["IdActivoPrinex"])
     dni = "{0}".format(item.properties["NumeroIdentificacion"])
     id_promocion = "{0}".format(item.properties["CodigoPromocion"])
     file = item.file
     ctx.load(file)
     ctx.execute_query()
     nombre_documento = "{0}".format(file.properties["Name"])
     fecha_envio = None
     IAObjeto = None
     
     return id_documento, id_sharepoint, ts_alta, origen, tipo_doc_SH, fecha_alta_origen, id_inmueble, nombre_documento, fecha_envio, dni, int(id_promocion), IAObjeto

ctx, lib = call_lib(site_url,client_id, client_secret,serv_origen[i]) 
id_documento, id_sharepoint, ts_alta, origen, tipo_doc_SH, fecha_alta_origen, id_inmueble, nombre_documento, fecha_envio, dni,id_promocion, IAObjeto = get_metadata_from_sh (ctx,lib,doc)