Como escrever, empacotar e distribuir uma biblioteca em Python

Python é uma ótima linguagem de programação, mas a embalagem é um de seus pontos mais fracos. É um fato bem conhecido na comunidade. Instalar, importar, usar e criar pacotes melhorou muito ao longo dos anos, mas ainda não está no mesmo nível de linguagens mais recentes, como Go e Rust, que aprenderam muito com as dificuldades do Python e outras linguagens maduras.

Neste tutorial, você aprenderá tudo o que precisa saber sobre como escrever, empacotar e distribuir seus próprios pacotes.

Como escrever uma biblioteca Python

Uma biblioteca Python é uma coleção coerente de módulos Python organizados como um pacote Python. Em geral, isso significa que todos os módulos vivem no mesmo diretório e que esse diretório está no caminho de pesquisa do Python.

Vamos escrever rapidamente um pequeno pacote Python 3 e ilustrar todos esses conceitos.

O Pacote de Patologia

Python 3 tem um excelente Path objeto, que é uma grande melhoria em relação ao desajeitado Python 2 os.path módulo. Mas está faltando um recurso crucial – encontrar o caminho do script atual. Isso é muito importante quando você deseja localizar arquivos de acesso relativos ao script atual.

Em muitos casos, o script pode ser instalado em qualquer local, portanto, você não pode usar caminhos absolutos, e o diretório de trabalho pode ser definido com qualquer valor, portanto, não pode usar um caminho relativo. Se você deseja acessar um arquivo em um subdiretório ou diretório pai, deve ser capaz de descobrir o diretório de script atual.

Aqui está como você faz isso em Python:

Para acessar um arquivo chamado ‘file.txt’ em um subdiretório ‘data’ do diretório do script atual, você pode usar o seguinte código: print(open(str(script_dir/'data/file.txt').read())

Com o pacote de patologia, você tem um built-in script_dir método, e você o usa assim:

Sim, é um bocado. O pacote de patologia é muito simples. Ele deriva sua própria classe Path do Path do pathlib e adiciona uma script_dir() que sempre retorna o caminho do script de chamada.

Aqui está a implementação:

Devido à implementação multiplataforma de pathlib.Pathvocê pode derivar diretamente dele e deve derivar de uma subclasse específica (PosixPath ou WindowsPath). o script_dir A resolução usa o módulo de inspeção para localizar o chamador e, em seguida, seu atributo de nome de arquivo.

Testando o Pacote de Patologia

Sempre que você escreve algo que é mais do que um script descartável, você deve testá-lo. O módulo de patologia não é exceção. Aqui estão os testes usando a estrutura de teste de unidade padrão:

O caminho do Python

Os pacotes Python devem ser instalados em algum lugar no caminho de pesquisa do Python para serem importados pelos módulos do Python. O caminho de pesquisa do Python é uma lista de diretórios e está sempre disponível em sys.path. Aqui está minha corrente sys.path:

Observe que a primeira linha vazia da saída representa o diretório atual, então você pode importar módulos do diretório de trabalho atual, seja ele qual for. Você pode adicionar ou remover diretórios diretamente de/para sys.path.

Você também pode definir um PYTHONPATH variável de ambiente e há algumas outras maneiras de controlá-la. O padrão site-packages está incluído por padrão, e é aqui que os pacotes que você instala usando o pip go.

Como empacotar uma biblioteca Python

Agora que temos nosso código e testes, vamos empacotar tudo em uma biblioteca adequada. Python fornece uma maneira fácil através do módulo de configuração. Você cria um arquivo chamado setup.py no diretório raiz do seu pacote.

o setup.py files inclui muitas informações de metadados, como autor, licença, mantenedores e outras informações sobre o pacote. Isso além do packages item que usa o find_packages() função importada de setuptools para encontrar subpacotes.

Aqui está o setup.py arquivo do pacote de patologia:

Pacote de distribuição de origem

Um pacote de distribuição de origem refere-se a um arquivo que contém pacotes python, módulos e outros arquivos que são usados ​​para um lançamento de pacote (por exemplo, versão 1, 2 e assim por diante). Depois que o arquivo for distribuído, os usuários finais poderão baixá-lo e instalá-lo em seu sistema operacional.

Para criar um pacote de distribuição de origem (sdist), execute: python setup.py sdist

Vamos construir uma distribuição fonte:

O aviso é porque eu usei um não padrão README.md Arquivo. É seguro ignorar. O comando acima criará um arquivo compactado com o formato padrão para o sistema operacional atual. Para sistemas Unix, um arquivo tar compactado em gzip será gerado, sob a distância diretório:

Se você estiver usando o Windows, um arquivo zip será gerado.

Você também pode especificar outros formatos de arquivo adicionais usando a opção de formato da seguinte maneira.

Por exemplo, o comando acima irá gerar um tarball compactado em gzip e um arquivo zip.

Os diferentes formatos disponíveis são:

  • zip: .fecho eclair
  • gztar: .tar.gz
  • bztar: .tar.bz2
  • xztar: .tar.xz
  • ztar: .tar.Z
  • tar: .alcatrão

Distribuição Binária

Para criar uma distribuição binária, chamada roda, você executa: python setup.py bdist_wheel

E aqui está uma distribuição binária:

O pacote pathology contém apenas módulos Python puros, portanto, um pacote universal pode ser construído. Se o seu pacote inclui extensões C, você terá que construir uma roda separada para cada plataforma:

Para um mergulho mais profundo no tópico de empacotar bibliotecas Python, confira Como escrever seus próprios pacotes Python.

Como distribuir um pacote Python

Python tem um repositório central de pacotes chamado PyPI (Python Packages Index). O PyPI facilita o gerenciamento de diferentes versões de pacotes. Por exemplo, se um usuário precisar instalar uma versão de pacote específica, o pip sabe onde procurá-la.

Quando você instala um pacote Python usando pip, ele baixa o pacote do PyPI (a menos que você especifique um repositório diferente). Para distribuir nosso pacote de patologia, precisamos carregá-lo no PyPI e fornecer alguns metadados extras que o PyPI requer. Os passos são:

  • Atualize sua versão pip.
  • Crie uma conta no PyPI (apenas uma vez).
  • Registre seu pacote.
  • Carregue seu pacote.

Atualize sua versão do pip

Certifique-se de ter a versão mais recente do pip instalada em seu sistema operacional. Para atualizar o pip, emita o seguinte comando

Crie a sua conta aqui

Você pode criar uma conta no site PyPI. Em seguida, crie um .pypirc arquivo em seu diretório inicial:

Para fins de teste, você pode adicionar um pypitest servidor de indexação para o seu arquivo .pypirc Arquivo:

Registre seu pacote

Se esta for a primeira versão do seu pacote, você precisa registrá-lo no PyPI. Use o comando de registro de setup.py. Ele vai pedir sua senha. Observe que eu aponto para o repositório de teste aqui:

Carregue seu pacote

Agora que o pacote está registrado, podemos carregá-lo. Eu recomendo usar barbante, que é mais seguro. Instale-o normalmente usando pip install twine. Em seguida, faça o upload do seu pacote usando barbante e forneça sua senha (redigido abaixo):

O pacote já está disponível no site oficial do Pypi, conforme mostrado abaixo.

Para instalá-lo com pip, basta emitir o seguinte comando:

Para um mergulho mais profundo no tópico de distribuição de seus pacotes, confira Como compartilhar seus pacotes Python.

Conclusão

Neste tutorial, passamos pelo processo completo de escrever uma biblioteca Python, empacotá-la e distribuí-la por meio do PyPI. Neste ponto, você deve ter todas as ferramentas para escrever e compartilhar suas bibliotecas com o mundo.

Este post foi atualizado com contribuições de Esther Vaati. Esther é desenvolvedora de software e escritora da Envato Tuts+.

Deixe uma resposta