- Instale-o em um interpretador Python existente. Este é o cenário mais comum, mas requer a configuração de uma cópia do intérprete. Na melhor das hipóteses, isso significa uma etapa totalmente separada, repleta de complexidade se já existirem versões do Python no sistema. Esse também é o cenário que as pessoas querem evitar em primeiro lugar, porque querem tornar seu aplicativo o mais fácil possível de redistribuir.
- Agrupe o interpretador com o programa e suas dependências. Esta é a abordagem adotada por projetos como PyInstaller e Nuitka. A desvantagem é que os resultados tendem a ser bastante grandes e criá-los requer aprender as peculiaridades desses projetos. Mas eles funcionam.
- Use um sistema como o Docker para agrupar o programa. Os contêineres Docker apresentam seu próprio mundo de compensações. Por um lado, você obtém absolutamente tudo o que precisa para executar o programa, incluindo quaisquer dependências no nível do sistema. Por outro lado, o recipiente resultante pode ser positivamente robusto. E, claro, usar o Docker significa adotar um ecossistema de software adicional.
Algumas das soluções mais recentes para o problema tentam resolver um ou outro ponto problemático específico, como forma de tornar todo o problema menos desagradável. Por exemplo, PyApp usa Rust para construir um binário autoextraível que instala a distribuição Python necessária, seu aplicativo e todas as suas dependências. Ele tem duas grandes desvantagens: você precisa do compilador Rust para construí-lo para o seu projeto, e seu projeto deve ser um pacote instalável que use o pyproject.toml padrão. O primeiro destes requisitos será provavelmente o maior obstáculo; a maioria dos projetos Python precisa de um pyproject.toml de algum tipo neste momento.
Outra solução é uma que eu mesmo escrevi: pydeploy. Também exige que o projeto em questão seja instalável via pip install. De outra forma, pydeploy não precisa de nada mais do que a biblioteca padrão do Python para gerar um produto independente com o tempo de execução do Python incluído. Sua grande desvantagem no momento é que ele só funciona no Microsoft Windows, mas em teoria poderia funcionar em qualquer sistema operacional.
Talvez algum dia
Todas as recentes mudanças importantes propostas para o Python, como o novo JIT nativo e a simultaneidade total ou multithreading, têm como objetivo melhorar o comportamento do Python como uma linguagem dinâmica. Quaisquer propostas destinadas a mudar esse dinamismo significariam essencialmente a criação de uma nova linguagem com expectativas diferentes sobre o seu comportamento.
