English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية

Detalhamento da maneira de empacotar e publicar módulos Python

Prefácio

Ontem, empacotei minha biblioteca de processamento de arquivos VASP e o upload para PyPI, agora você pode instalar o VASPy diretamente através do pip e easy_install (ao mesmo tempo, bem-vindo a todos os estudantes que usam VASP para cálculos de química, adicionem estrelas e participem)

Endereço do GotHub do VASPy:https://github.com/PytLab/VASPy
Endereço PyPI do VASPy:https://pypi.python.org/pypi/vaspy/

Devido à minha má memória, tenho medo de que, com o passar do tempo, eu esqueça, então aqui, aproveitando o calor, uso meu próprio programa VASPy como exemplo para fazer uma resumo da empacotamento e upload do python.

Estrutura do pacote VASPy

Primeiro, escreva aqui a estrutura completa do pacote VASPy, o conteúdo subsequente será explicado com esse exemplo:

VASPy/
├── LICENSE
├── MANIFEST
├── MANIFEST.in
├── README.rst
├── requirements.txt
├── scripts
│  ├── change_incar_parameters.py
│  ├── create_inputs.py
│  └── ...
├── setup.cfg
├── setup.py
├── tests
│  ├── incar_test.py
│  ├── __init__.py
│  ├── oszicar_test.py
│  ├── outcar_test.py
│  ├── testdata
│  │  ├── CONTCAR
│  │  ├── DOS_SUM
│  │  ├── ELFCAR
│  │  └── ...
│  └── ...
└── vaspy
  ├── __init__.py
  ├── iter.py
  ├── matstudio.py
  └── ...
4 diretórios, 54 arquivos

ferramenta para empacotar e instalar pacotes de terceiros

Aqui precisamos usar ferramentas como setuptools e pip para empacotar, publicar e instalar nossos próprios pacotes, se precisar construir em wheel, também é necessário instalar o módulo wheel. Se a versão do python >=2.7.9ou >=3.4setuptools e pip já estão instalados, pode ser necessário atualizá-los para a versão mais recente

pip install -U pip setuptools

Você pode usar ferramentas de gerenciamento de pacotes, por exemplo

yum install pip
sudo apt-instalar pip

através de get-instalação de scripts pip.py, se detectar que o wheel e setuptools não estão instalados, também serão instalados automaticamente

python get-pip.py

A instalação e introdução de ferramentas específicas não serão discutidas, você pode consultar os requisitos para instalar pacotes

função de diferentes arquivos no pacote

setup.py

Este arquivo é o arquivo mais importante para empacotar todo o projeto, ele oferece duas funções principais:

função setup(), os parâmetros dessa função especificam como configurar seu próprio projeto.
ferramenta de linha de comando, incluindo empacotamento, teste, publicação etc. Você pode verificar os comandos a seguir;

python setup.py --ajuda-comandos

setup.cfg

Este arquivo contém alguns parâmetros padrão usados durante a construção, por exemplo, ao construir bdist_wheel--parâmetro universal

[bdist_wheel]
universal=1

Dessa forma, sempre que empacotar, será usado automaticamente--O parâmetro universal, o efeito é semelhante:

python setup.py bdist_wheel --universal

README.rst

Este inicialmente foi escrito em markdown, após empacotar e publicar no PyPI, descobri que o PyPI não suporta a renderização de markdown, a página ficou um caos, então usei a sintaxe do reStructuredText para escrevê-lo novamente. Afinal, a sintaxe das linguagens de marcação é basicamente fácil de aprender, e se não for, pode-se encontrar um modelo para copiar e colar.
As regras de sintaxe do reStructuredText podem ser consultadas no documento oficial: Quick reStructuredText

Na verdade, há outra maneira de usar o pandoc para converter markdown para formato rst, uma maneira conveniente é usar o módulo pyandoc para converter automaticamente ao publicar.
Você pode consultar o método específico em: Use Markdown README's in Python modules

MANIFEST.in

Este arquivo informa ao setuptools quais arquivos precisam ser empacotados adicionalmente durante a empacotamento, por exemplo, nos arquivos de dados de teste de teste unitário do VASPy, uso este arquivo para incluí-los. Claro, README, LICENSE e outros também podem ser empacotados juntos.
A seguir está o conteúdo do meu MANIFEST.in:

include README.rst
include requirements.txt
include LICENSE
recursive-include scripts *
recursive-include tests *

As regras de sintaxe específicas podem ser consultadas em: The MANIFEST.in template

vaspy/

Este diretório é o pacote onde o código-fonte do vaspy está localizado.

tests/

Este diretório também é um subpacote que contém scripts de teste unitário, para que você possa usar python setup.py test para testes unitários, adicionamos __init__.py para torná-lo um pacote.

Parâmetros do setup()

Aqui estão alguns dos parâmetros que uso, para uso específico de outros parâmetros, consulte:https://docs.python.org/3/distutils/setupscript.html

name

versions = "vaspy"

É o nome completo do projeto, que será usado juntamente com o número da versão após a empacotamento.

version

from vaspy import __version__
version = __version__

description

É uma descrição breve do projeto, geralmente uma frase, que será exibida na parte inferior do nome no PyPI.

long_description

É uma descrição longa, equivalente a uma descrição concisa do projeto, se esta string estiver no formato rst, o PyPI renderizará automaticamente em HTML. Aqui você pode ler diretamente o conteúdo do README.rst.

url

Conexão do pacote, geralmente um link no GitHub ou um link no readthedocs.

packages

Lista de subpacotes a serem incluídos, o setuptools oferece a função find_packages() para encontrar pacotes na raiz do diretório, função que não existe no distutil.

setup_requires

Este parâmetro define outras dependências necessárias para a instalação e execução bem-sucedida do VASPy, que serão instaladas quando usar o pip.
Para a diferença entre este parâmetro e requirements.txt, consulte: install_requires vs Arquivos de Requisitos

classifier

Este parâmetro fornece uma série de categorias, que serão colocadas em diferentes diretórios no PyPI para classificar projetos.
Referências para os nomes e regras específicos das categorias:https://pypi.python.org/pypi#63;%3Aaction=list_classifiers

test_suite

Este parâmetro pode nos ajudar a usar

python setup.py test

Para executar testes unitários, não é mais necessário escrever um script separado, como run_tests.py, para executar os testes unitários.
A explicação oficial deste parâmetro:

Um string que nomeia uma subclasse unittest.TestCase (ou um pacote ou módulo contendo uma ou mais delas, ou um método dessa subclasse), ou nomeia uma função que pode ser chamada sem argumentos e retorna um unittest.TestSuite. Se o conjunto nomeado é um módulo e o módulo possui uma função additional_tests(), ela é chamada e os resultados são adicionados aos testes a serem executados. Se o conjunto nomeado é um pacote, quaisquer submódulos e subpacotes são recursivamente adicionados ao conjunto de testes geral.

Isso significa que esse parâmetro pode aceitar vários tipos de parâmetros:

Recebe subclasses de unittest.TestCase, podemos escrever todos os testes unitários em um único caso de teste, importá-lo e passar para o test_suite
Recebe um objeto de função, esse objeto de função não tem nenhum parâmetro e retorna um unittest.TestSuite. Assim, podemos escrever uma função separada, combinar vários casos de teste em um suite e retorná-lo, então importamos a função e a passamos para o test_suite.

Nomes de módulos e pacotes, eu uso essa maneira, antes meus testes eram separados em vários scripts, então eu posso adicionar um __init__.py para torná-lo um pacote, passar o nome do pacote para o test_suite, e o setuptools mágica-mente executará todos os testes no pacote, então, quando eu adicionar novos scripts de teste no futuro, eu apenas adiciono novos scripts e nada mais precisa ser alterado.

Efeito de execução:

zjshao@SHAO-PC:/mnt/d/Dropbox/Código/CentOS_code/VASPy$ python setup.py teste
executando teste
executando egg_info
criando vaspy.egg-info
escrevendo vaspy.egg-info/PKG-INFO
escrevendo top-nomes de níveis para vaspy.egg-info/top_level.txt
escrevendo dependency_links para vaspy.egg-info/dependency_links.txt
writing manifest file 'vaspy.egg-info/SOURCES.txt'
ler arquivo de manifesto 'vaspy.egg-info/SOURCES.txt'
reading manifest template 'MANIFEST.in'
writing manifest file 'vaspy.egg-info/SOURCES.txt'
running build_ext
test_compare (tests.incar_test.InCarTest)
Make sure we can compare two InCar objects correctly ... ok
test_eq (tests.incar_test.InCarTest)
Test __eq__() function ... ok
...
Some outputs are omitted here
----------------------------------------------------------------------
Ran 22 tests in 3.574s
OK

Publish your own Python package

1. First, go to PyPI and register an account

2. Configuration ~/.pypirc as follows:

[distutils]
index-servers =
  pypi
  pypitest
[pypi]
username:ShaoZhengjiang
password:mypassword
[pypitest]
username:ShaoZhengjiang
password:mypassword

3Then register and upload your own package to the test server

PyPI provides a test server where we can perform tests.

python setup.py register -r pypitest

Then

python setup.py sdist upload -r pypitest

If there are no problems, we should not get any errors.

4Upload to PyPI

If the above test is successful, we can register and upload the package in the same steps.

python setup.py register -r pypi
python setup.py sdist upload -r pypi

Ok, after that we can access PyPI (https://pypi.python.org/pypi/vaspy/On the screen we see our own packages.

Você também pode gostar