PyTrustNFe icon indicating copy to clipboard operation
PyTrustNFe copied to clipboard

OSError: [Errno 24] Too many open files

Open SrLucca opened this issue 11 months ago • 0 comments

Olá, constantemente possuo problemas ao gerar notas de modo assíncrono com a seguinte mensagem de erro:

Traceback (most recent call last): File "/var/www/gti/venv/lib/python3.9/site-packages/celery/app/trace.py", line 450, in trace_task R = retval = fun(*args, **kwargs) File "/var/www/gti/venv/lib/python3.9/site-packages/celery/app/trace.py", line 731, in protected_call return self.run(*args, **kwargs) File "/var/www/gti/fhserasa/financeiro/util.py", line 997, in gerar_nfse raise e File "/var/www/gti/fhserasa/financeiro/util.py", line 991, in gerar_nfse xml_send = goiania.xml_gerar_nfse(certify, **rps) File "/var/www/gti/venv/src/pytrustnfe3/pytrustnfe/nfse/goiania/init.py", line 45, in xml_gerar_nfse return _render(certificado, "GerarNfse", **kwargs) File "/var/www/gti/venv/src/pytrustnfe3/pytrustnfe/nfse/goiania/init.py", line 15, in _render xml_send = render_xml(path, f"{method}.xml", False, **kwargs) File "/var/www/gti/venv/src/pytrustnfe3/pytrustnfe/xml/init.py", line 29, in render_xml File "/var/www/gti/venv/lib/python3.9/site-packages/jinja2/environment.py", line 997, in get_template File "/var/www/gti/venv/lib/python3.9/site-packages/jinja2/environment.py", line 958, in _load_template File "/var/www/gti/venv/lib/python3.9/site-packages/jinja2/loaders.py", line 125, in load File "/var/www/gti/venv/lib/python3.9/site-packages/jinja2/loaders.py", line 197, in get_source File "/var/www/gti/venv/lib/python3.9/site-packages/jinja2/utils.py", line 228, in open_if_exists OSError: [Errno 24] Too many open files: '/var/www/gti/venv/src/pytrustnfe3/pytrustnfe/nfse/goiania/templates/GerarNfse.xml'

Imagino que o erro pode estar na forma que é gerenciado os arquivos nestes trechos nos arquivos pytrustnfe3/pytrustnfe/nfse/goiania/init.py e pytrustnfe3/pytrustnfe/xml/init.py:

pytrustnfe3/pytrustnfe/xml/init.py

def render_xml(path, template_name, remove_empty, **nfe):
    nfe = recursively_normalize(nfe)
    env = Environment(loader=FileSystemLoader(path))
    env.filters["normalize"] = filters.strip_line_feed
    env.filters["normalize_str"] = filters.normalize_str
    env.filters["format_percent"] = filters.format_percent
    env.filters["format_datetime"] = filters.format_datetime
    env.filters["format_date"] = filters.format_date
    env.filters["comma"] = filters.format_with_comma

    template = env.get_template(template_name)
    xml = template.render(**nfe).replace("\n", "")
    parser = etree.XMLParser(
        remove_blank_text=True, remove_comments=True, strip_cdata=False
    )
    root = etree.fromstring(xml, parser=parser)
    for element in root.iter("*"):  # remove espaços em branco
        if element.text is not None and not element.text.strip():
            element.text = None
    if remove_empty:
        context = etree.iterwalk(root)
        for dummy, elem in context:
            parent = elem.getparent()
            if recursively_empty(elem):
                parent.remove(elem)
        return root
    return etree.tostring(root, encoding=str)

pytrustnfe3/pytrustnfe/nfse/goiania/init.py

def _render(certificado, method, **kwargs):
    path = os.path.join(os.path.dirname(__file__), "templates")
    xml_send = render_xml(path, f"{method}.xml", False, **kwargs)
    signer = Assinatura(certificado.pfx, certificado.password)
    xml_send = etree.fromstring(xml_send)
    xml_send = signer.assina_xml(xml_send)
    return xml_send


def _send(certificado, method, **kwargs):
    base_url = "https://nfse.goiania.go.gov.br/ws/nfse.asmx?wsdl"
    xml_send = kwargs["xml"]
    cert, key = extract_cert_and_key_from_pfx(certificado.pfx, certificado.password)
    cert, key = save_cert_key(cert, key)
    client = get_authenticated_client(base_url, cert, key)

    try:
        response = getattr(client.service, method)(xml_send)
    except suds.WebFault as e:
        return {
            "send_xml": str(xml_send),
            "received_xml": str(e.fault.faultstring),
            "object": None,
        }

    response, obj = sanitize_response(response)
    return {"send_xml": str(xml_send), "received_xml": str(response), "object": obj}


def xml_gerar_nfse(certificado, **kwargs):
    """ Retorna o XML montado para ser enviado para o Webservice """

    return _render(certificado, "GerarNfse", **kwargs)

Alguem tem ideia de como resolver este problema?

SrLucca avatar Feb 04 '25 15:02 SrLucca