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