python - 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) 代码最终崩溃。
有人对如何解决这个问题有任何建议吗?
解决方案
早上好
最后我发现了问题
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)
推荐阅读
- sql - 根据优先级匹配 ID - SQL
- c++ - aws sdk c++ 代码不适用于发布版本
- c++ - 指向成员的 C++ 类内初始化使 MSVC 失败(但 GCC/Clang 工作)
- angular - 何时需要开发 Progressive Web App (PWA)?
- canvas - 如何在父画布的固定位置将画布放在画布上?
- node.js - 如何将多个可读流(从多个 api 请求)传输到单个可写流?
- reactjs - 即使在反应中指定了数组中元素的 id 后,此错误“列表中的每个子项都应具有唯一的“键”道具。”
- php - 将json数组转换为csv后如何访问csv文件
- javascript - 我想在弹出框中启用 javascript
- android - 我的 android 应用程序无法从最新设备上的 playstore 下载