首页 > 解决方案 > Python 最大递归深度超过了仅在 .exe 中编译后获取共享点元数据

问题描述

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

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

我正在使用 Windows10 和 Python 3.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.setrecursionlimit(1500) 但我仍然遇到相同的错误,并且使用 sys.setrecursionlimit(1000**6) 代码最终崩溃。

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

标签: pythonsharepointoffice365pyinstaller

解决方案


早上好

最后我发现了问题

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)

推荐阅读