Skip to main content
Pre-release

This release is a pre-release and may not be stable for production use.

ACBr Python

SDK Python para NF-e/NFC-e que inicia diretamente o executável nativo escrito em Free Pascal com ACBr e troca mensagens JSON pelos pipes do processo. Independente de Django, Flask ou outro framework, é instalado com pip e importa como acbr, sem dependências Python de execução.

Versão alpha 0.1.0a5

Documentação online

Sem homologação fiscal.

A camada Python reaproveita o contrato de tipos e o motor ACBr, sem reimplementar cálculos, assinatura ou regras fiscais. A API pública oferece gerar_xml, validar, assinar, transmitir, consultar, cancelar, inutilizar e a interface experimental recuperar_xml. Todas as operações que podem acessar a SEFAZ exigem allow_network=True explícito por chamada.

O runtime fixado é 0.2.1, versão do pacote que distribui os executáveis, bibliotecas, schemas, fontes e licenças. Seus executáveis e contrato são idênticos aos da distribuição 0.2.0; a atualização completa os textos de licença. A versão da distribuição nativa é independente da versão do SDK Python. O protocolo usa versão 1 e contrato ACBr da revisão 48590.

Este repositório contém o SDK público reutilizável. Aplicações consumidoras, inclusive uma integração privada, instalam o pacote e fornecem sua própria configuração em execução. Dados de empresas, certificados e credenciais da aplicação consumidora não fazem parte do SDK.

Plataformas e instalação

O cliente tem como alvo CPython 3.11 a 3.14, Windows x64 e Linux x64 com glibc. O runtime Linux de referência foi construído para Ubuntu 24.04. A matriz da CI cobre essas versões nos dois sistemas; uma matriz configurada não significa que uma execução tenha passado. macOS, ARM, Python 32 bits, Alpine/musl e outras implementações Python não fazem parte deste MVP.

Crie um ambiente virtual:

python -m venv .venv

Ative o ambiente (.venv\Scripts\Activate.ps1 no PowerShell ou source .venv/bin/activate no bash). Após a disponibilização desta versão no PyPI:

python -m pip install acbr-python==0.1.0a5
python -m acbr --version
python -m acbr describe Ide.tpNF
python -m acbr ajuda TTipoNFe

Os comandos ajuda retornam JSON e já existem na 0.1.0a3. A 0.1.0a4 acrescenta describe em texto, describe --json, --version e a API Python describe_type. Para testar esta cópia antes de sua publicação, instale o repositório com python -m pip install .. A instalação da 0.1.0a3 não fornece os novos comandos.

Esses comandos de ajuda são offline e não exigem runtime. Para as operações nativas, a instalação é uma etapa explícita, separada de pip install:

python -m acbr runtime install --directory .runtime
python -m acbr doctor --directory .runtime/runtime

O instalador baixa o .tgz nativo original 0.2.1 por HTTPS do registry npm, usado como armazenamento do artefato. Não é necessário instalar Node.js ou npm, e nenhum comando npm é executado. O instalador escolhe o arquivo para o sistema e arquitetura atuais. Antes de extrair, verifica tamanho e SHA-256 fixados no pacote; depois confere os arquivos do inventário. Fontes, licenças, schemas, serviços e bibliotecas acompanham o runtime. Para uma instalação sem download, obtenha previamente o .tgz correspondente ao pin e use --archive caminho/arquivo.tgz no mesmo comando de instalação.

Use uma pasta de runtime sob seu controle e informe o caminho runtime retornado pelo instalador ao cliente. doctor verifica a instalação; não consulta a SEFAZ nem atesta validade fiscal de documentos.

Uso com documento sintético

A fixture versionada é sintética, sem valor fiscal. O exemplo abaixo gera XML localmente; não transmite documento nem usa certificado:

import json
from pathlib import Path

from acbr import Configuracao, Documento, Emissor

dados = json.loads(Path("tests/fixtures/documento.json").read_text("utf-8"))
config = Configuracao(cnpj="11222333000181", uf="CE", modelo=55, ambiente=2)

with Emissor(config, runtime_directory=Path(".runtime/runtime"), timeout=120) as emissor:
    resultado = emissor.gerar_xml(Documento(dados))
    print(resultado.sucesso, resultado.estado, resultado.codigo)
    if resultado.sucesso and resultado.xml is not None:
        validacao = emissor.validar(resultado.xml)
        print(validacao.sucesso, validacao.codigo)

Um XML sem assinatura pode falhar no schema que exige assinatura. A validação estrutural Python e a validação local nativa não substituem homologação nem autorização fiscal. Nenhum teste desta entrega usa certificado A1 de contribuinte, documentos privados ou tráfego fiscal.

Modelos, campos e tipos

O contrato compartilhado fornece modelos gerados e ajuda de campos/tipos. Na versão 0.1.0a3, use python -m acbr ajuda TARGET para JSON ou acbr.describe_field() em Python. A partir da 0.1.0a4:

python -m acbr --version
python -m acbr describe Ide.tpNF
python -m acbr describe TTipoNFe --json
python -m acbr describe 'Det[].Prod.vProd'

describe exibe texto em português; --json retorna o mesmo objeto de describe_field. ajuda TARGET permanece compatível e sempre usa JSON. Essas consultas, --help e --version não executam o motor nem acessam a rede.

from typing import get_args

from acbr import describe_field
from acbr.models import TTipoNFe

print(get_args(TTipoNFe))  # ('tnEntrada', 'tnSaida')
print(describe_field("Ide.tpNF")["declaredDefault"])  # tnSaida

TTipoNFe é um alias Literal, não uma classe Enum. Os nomes e o padrão de campo acima vêm do contrato; a ajuda não aplica esse padrão ao documento nem atribui significado fiscal adicional aos valores.

Maiúsculas e minúsculas seguem o contrato ACBr. Decimais são strings, como "10.00", para evitar a perda de precisão de float. Datas seguem o formato civil do contrato e campos omitidos não recebem defaults fiscais inventados. Consulte a ajuda do tipo antes de construir um documento. Veja o guia de ajuda para caminhos, tipos, API estrita e códigos de saída.

Prazos, cancelamento e encerramento

Cada operação usa seu próprio processo nativo, com JSON pelo stdin/stdout, sem shell. O cliente limita bytes, drena os pipes e impõe prazo à comunicação. timeout é expresso em segundos; o limite padrão max_bytes é 8 MiB. Use o emissor como context manager ou chame fechar() ao terminar. Uma instância aceita uma operação por vez; chamadas concorrentes recebem EMISSOR_OCUPADO, sem fila implícita. O prazo cobre comunicação e execução do filho; a verificação prévia dos arquivos tem seu próprio custo.

As operações aceitam cancel=evento, com evento do tipo threading.Event. Definir o evento solicita cancelamento cooperativo durante a chamada; não reverte uma operação que já tenha ocorrido no serviço remoto. O cliente não repete chamadas automaticamente. Um prazo excedido ou uma resposta perdida não prova que uma operação remota deixou de acontecer.

Resultados e erros têm tipos próprios; ResultadoFiscal.xml exige acesso explícito ao conteúdo. Não registre XML, PFX, senhas nem a carga completa de uma chamada. As representações padrão ocultam conteúdo sensível.

Para registrar o início observado de um envio na aplicação consumidora, Emissor(..., ao_iniciar_envio=callback) entrega ao callback um EventoEnvio imutável, com identificador de correlação e comando, sem dados fiscais. O evento apenas observa o marcador do worker para transmitir, cancelar ou inutilizar; não confirma aceitação, não fornece idempotência e não garante persistência antes do envio. Se o callback falhar, o resultado pode ser incerto e não há repetição automática.

Operações públicas e acesso à rede

Método Entrada Rede fiscal
gerar_xml Documento ou dicionário do contrato Não
validar XML em texto Não
assinar XML em texto, com A1 na configuração Não
transmitir XML assinado Exige allow_network=True
consultar Consulta com chave e recibo opcional Exige allow_network=True
cancelar Cancelamento Exige allow_network=True
inutilizar Inutilizacao Exige allow_network=True
recuperar_xml XML assinado, interface experimental Exige allow_network=True

Consulta, Cancelamento e Inutilizacao são dataclasses de entrada exportadas por acbr. Todas as operações retornam ResultadoFiscal e aceitam cancel=threading.Event(). Os métodos de rede também requerem A1 na configuração. O bloqueio é aplicado antes de iniciar uma chamada ao worker; selecionar ambiente=2 não libera rede por si só.

O cliente não oferece repetição automática nem opções de lote ou modo assíncrono. A transmissão segue o comportamento síncrono do worker fixado. A CLI oferece somente ajuda e gestão do runtime: não há comandos CLI para transmitir, consultar, cancelar ou inutilizar documentos.

Veja as assinaturas, tipos, resultados e erros na referência da API. As operações de rede são verificadas por protocolo simulado; nenhuma delas foi exercitada contra a SEFAZ nesta entrega.

Recuperação de XML: interface experimental

recuperar_xml(xml_assinado) requer CertificadoA1(pfx: bytes, senha: str) na configuração e pode consultar a SEFAZ para reconstruir o XML processado. A chamada só permite rede com allow_network=True explícito; o padrão a bloqueia. O cliente envia o certificado pelo stdin, nunca por argumentos.

Nesta entrega, essa interface só é verificada por testes de protocolo com worker simulado e materiais sintéticos. Não há teste de recuperação na SEFAZ nem uso de certificado de contribuinte. A implementação não deve ser tratada como homologada. Não é disponibilizado exemplo que realize essa consulta.

Desenvolvimento e verificação

python -m pip install -e .
python -m unittest discover -s tests -v
python tools/generate_models.py --check
python -m pip install build
python -m build

A suíte padrão usa fixtures e workers simulados e dispensa internet após a instalação das ferramentas. O teste nativo é opt-in: defina ACBR_TEST_RUNTIME para o caminho de uma instalação verificada e execute python -m unittest discover -s tests -p test_native.py -v. Instale antes python -m pip install "cryptography>=46": essa dependência é somente dos testes e cria um A1 sintético efêmero; ela não é dependência de execução do SDK. O smoke cobre geração, assinatura e validação locais pela API pública, rejeição de assinatura alterada e entrada inválida, sem operações fiscais remotas. A CI instala explicitamente os runtimes Windows e Linux e essa dependência de teste, além da matriz de testes offline e build. Não há publicação automática nem credenciais de publicação na CI.

Veja arquitetura e escopo para as decisões do SDK.

Licenças e fontes

Cliente e contrato: LGPL-2.1-or-later; consulte LICENSE e NOTICE. O wheel não incorpora binários nativos. A instalação preserva fontes e licenças dos arquivos originais do runtime; os componentes nativos mantêm as respectivas licenças e exceções.

Referências oficiais consultadas:

Este é um projeto independente, sem certificação oficial pelo Projeto ACBr.

Metadata

Release files for acbr-python 0.1.0a5

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for acbr-python 0.1.0a5
File Size Uploaded Provenance
acbr_python-0.1.0a5.tar.gz 125.6 kB With provenance Details

Built distribution (wheel)

Table of built distributions (wheels) for acbr-python 0.1.0a5
File Interpreter ABI Platform
acbr_python-0.1.0a5-py3-none-any.whl Python 3 none any Details

Total release size: 200.8 kB

Release files / acbr_python-0.1.0a5.tar.gz

Download URL acbr_python-0.1.0a5.tar.gz
Size 125.6 kB
Tags Source
SHA-256 checksum
How to use checksums
bfb0e83aad0176d495f2058a2c24963f6df127be5b5d6e375c66836fe3efb579
BLAKE2b-256 checksum
How to use checksums
bf8b25b0cedfada58cfc82865a523a6875529d24ac883ed5e93e4be330de66a8
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Oct 17, 2026.

Transparency log

Release files / acbr_python-0.1.0a5-py3-none-any.whl

Download URL acbr_python-0.1.0a5-py3-none-any.whl
Size 75.2 kB
Tags Python 3
SHA-256 checksum
How to use checksums
d9fa667fcf40cdeacf2532609eb287f1149300e374f3992da44cddebe134e405
BLAKE2b-256 checksum
How to use checksums
a1db6be1ff0adc492dbccddde22d369dcd1a04bbe2b3e0fbf67dbcdc5ee852cd
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Oct 17, 2026.

Transparency log

Security for acbr-python 0.1.0a5

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

Full provenance

All 2 files in this release have been uploaded with provenance metadata.

Select from 2 files

Attestation for acbr_python-0.1.0a5.tar.gz

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Oct 17, 2026.

Transparency log

A note on package security

PyPI is a repository for distributing packages, not a service for auditing them. While third-party security researchers and our staff do their best to detect and remove malicious packages, PyPI cannot guarantee the quality, security or suitability of any given package.

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page