Skip to content

Commit 7bc4fab

Browse files
authored
Merge pull request #276 from mstuttgart/post/como-distribuir-seu-projeto-python-com-pypi
[NEW] Post Como distribuir seu projeto python com pypi
2 parents 19db800 + b610a1b commit 7bc4fab

File tree

2 files changed

+225
-0
lines changed

2 files changed

+225
-0
lines changed
Lines changed: 225 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,225 @@
1+
Title: Como distribuir sua aplicação Python com PyPI
2+
Slug: como-distribuir-sua-aplicacao-python-com-pypi
3+
Date: 2016-06-17 13:47:24
4+
Category: Python
5+
Tags: python, pypi, tutorial, desenvolvimento, pypi, pip
6+
Author: Michell Stuttgart
7+
Email: michellstut@gmail.com
8+
Github: mstuttgart
9+
Linkedin: michellstut
10+
Facebook: michell.stuttgart
11+
Site: http://codigoavulso.com.br
12+
13+
Imagine a seguinte situação: você passou alguns dias (ou mesmo meses) desenvolvendo uma módulo python, escreveu testes, implementou funcionalidades e depois de alguns ajustes, chegou a hora de liberar seu software para que outros desenvolvedores possam utilizá-lo. Qual o melhor modo de distribuí-lo?
14+
15+
![](images/mstuttgart/snapshot_44.png)
16+
17+
Caro leitor, se você costuma programar em Python (seja profissionalmente ou não) provavelmente já instalou outros módulos usando o [PyPI](https://pypi.python.org/pypi), através do comando abaixo:
18+
19+
```bash
20+
pip install nomedomodulo
21+
```
22+
23+
Não seria interessante usar o mesmo método para distribuir a sua aplicação? Sim? Então mãos a obra.
24+
25+
### Sobre o PyPI - Python Package Index
26+
27+
O site [PyPI](https://pypi.python.org/pypi), é um repositório de *softwares* desenvolvidos na linguagem Python. Em outras palavras, ele garante que seu pacote Python sempre esteja disponível para a instalação. O seu funcionamente é simples, porém algumas configurações inicias devem ser feitas para que tudo funcione corretamente.
28+
29+
### Crie uma conta
30+
31+
Primeiramente, para distribuir seus pacotes usando o [PyPI](https://pypi.python.org/pypi), precisamos criar uma conta em ambos os sites:
32+
33+
* [PyPI Live](https://pypi.python.org/pypi?%3Aaction=register_form)
34+
* [PyPI Test](https://testpypi.python.org/pypi?%3Aaction=register_form)
35+
36+
Recomendo que você utilize o mesmo email e senha para ambos os sites. Posteriormente, isso tornará mais fácil o processo de configuração.
37+
38+
### Configurando o ambiente
39+
40+
O próximo passo é criar um arquivo `.pypirc` em sua `home`. Esse arquivo contem informações de auteticação, tanto para o [PyPI Live](https://pypi.python.org/pypi) quando para o [PyPI Test](https://testpypi.python.org/pypi).
41+
42+
```bash
43+
touch ~/.pypirc
44+
```
45+
46+
Apesar de não ser obrigatório a criação desse aquivo, ele facilita muito nosso trabalho, uma vez que você não precisaremos inserir nosso email e senha toda vez que formos enviar nosso código para o [PyPI Live](https://pypi.python.org/pypi).
47+
48+
Abra o arquivo `.pypirc` em seu editor de texto favorito, e insira as informações abaixo.
49+
50+
```bash
51+
[distutils]
52+
index-servers =
53+
pypi
54+
pypitest
55+
56+
[pypi]
57+
repository=https://pypi.python.org/pypi
58+
username=seu_nomedeusuario
59+
password=sua_senha
60+
61+
[pypitest]
62+
repository=https://testpypi.python.org/pypi
63+
username=seu_nomedeusuario
64+
password=sua_senha
65+
66+
```
67+
Em *username* insira seu nome de usuário e *password*, insira sua senha. Faça isso tanto para o `pypi` quanto para o `pypitest`.
68+
69+
Um observação importante é que, caso a sua senha possua espaço, não a coloque entre aspas. Por exemplo, se a sua senha for "batuque da viola doida", coloque exatamente o mesmo texto em *password*.
70+
71+
72+
```bash
73+
password=batuque da viola doida
74+
```
75+
76+
### Preparando o seu módulo Python
77+
78+
Todo pacote distribuído pelo [PyPI](https://pypi.python.org/pypi) precisa ter uma arquivo `setup.py` em seu diretório raiz. E se seu projeto também usa um arquivo *readme* em *markdown* (normalmente chamado `README.md`) você também precisará criar um arquivo chamado `setup.cfg`no diretório raiz do módulo.
79+
80+
Como exemplo, iremos utilizar o módulo [codigo_avulso_test_tutorial](https://github.com/mstuttgart/codigo-avulso-test-tutorial) que criei para ser utilizado como exemplo em nossos tutoriais. Assim, temos a seguinte estrutura básica de diretórios:
81+
82+
```bash
83+
.
84+
├── codigo_avulso_test_tutorial
85+
│   ├── circulo.py
86+
│   ├── figura_geometrica.py
87+
│   ├── __init__.py
88+
│   └── quadrado.py
89+
├── LICENSE
90+
├── README.md
91+
├── setup.cfg
92+
├── setup.py
93+
└── test
94+
├── circulo_test.py
95+
├── figura_geometrica_test.py
96+
├── __init__.py
97+
└── quadrado_test.py
98+
99+
```
100+
Aqui, o que nos interessa são os arquivos `setup.py` e `setup.cfg`. Dentro do arquivo `setup.py` temos várias informações sobre nossa aplicação que serão usadas pelo [PyPI](https://pypi.python.org/pypi).
101+
102+
```python
103+
# -*- coding: utf-8 -*-
104+
from setuptools import setup
105+
106+
setup(
107+
name='codigo-avulso-test-tutorial',
108+
version='0.1.1',
109+
url='https://github.com/mstuttgart/codigo-avulso-test-tutorial',
110+
license='MIT License',
111+
author='Michell Stuttgart',
112+
author_email='michellstut@gmail.com',
113+
keywords='tutorial test unittest codigoavulso',
114+
description=u'Tutorial de teste unitário em Python para o blog Código Avulso',
115+
packages=['codigo_avulso_test_tutorial'],
116+
install_requires=[],
117+
)
118+
```
119+
O nome de cada *tag* é autoexplicativo, então não vou entrar em detalhes. Basta você usar o código acima e substituir com os dados do seu pacote.
120+
121+
O próximo passo é adicionar o seguinte conteúdo no arquivo `setup.cfg` (caso você o tenha criado).
122+
123+
```bash
124+
[metadata]
125+
description-file = README.md
126+
```
127+
Esse arquivo irá dizer ao [PyPI](https://pypi.python.org/pypi) onde seu arquivo *readme* está.
128+
129+
### Publicando sua aplicação Python
130+
131+
Agora iremos estudar os passos para enviar nossa aplicação para [PyPI](https://pypi.python.org/pypi), para que ela fique disponível para ser instalada através do `pip`.
132+
133+
#### Enviando para PyPI Test
134+
135+
Primeiramente, vamos registrar nossa aplicação no [PyPI Test](https://testpypi.python.org/pypi). Esse passo serve para verificarmos se está tudo certo com nosso pacote e também validar se já não existe outro módulo com o mesmo nome.
136+
Registramos nossa aplicação com o seguinte comando:
137+
138+
```bash
139+
python setup.py register -r pypitest
140+
```
141+
142+
Se tudo ocorrer bem teremos a seguinte saída (Server responde 200):
143+
144+
```bash
145+
running register
146+
running egg_info
147+
creating codigo_avulso_test_tutorial.egg-info
148+
writing codigo_avulso_test_tutorial.egg-info/PKG-INFO
149+
writing top-level names to codigo_avulso_test_tutorial.egg-info/top_level.txt
150+
writing dependency_links to codigo_avulso_test_tutorial.egg-info/dependency_links.txt
151+
writing manifest file 'codigo_avulso_test_tutorial.egg-info/SOURCES.txt'
152+
reading manifest file 'codigo_avulso_test_tutorial.egg-info/SOURCES.txt'
153+
writing manifest file 'codigo_avulso_test_tutorial.egg-info/SOURCES.txt'
154+
running check
155+
Registering codigo-avulso-test-tutorial to https://testpypi.python.org/pypi
156+
Server response (200): OK
157+
```
158+
Caso exista outro pacote com o mesmo nome, teríamos de escolher outro nome para o nosso pacote. Agora com nosso pacote devidamente registrado, executamos o comando abaixo para que o pacote seja enviado para o [PyPI Test](https://testpypi.python.org/pypi).
159+
160+
```bash
161+
python setup.py sdist upload -r pypitest
162+
```
163+
164+
Se tudo ocorrer bem (Server responde 200), você verá uma saída semelhante a esta e já poderá ver sua aplicação na lista do [PyPI Test](https://testpypi.python.org/pypi).
165+
166+
```bash
167+
running sdist
168+
running egg_info
169+
writing codigo_avulso_test_tutorial.egg-info/PKG-INFO
170+
writing top-level names to codigo_avulso_test_tutorial.egg-info/top_level.txt
171+
writing dependency_links to codigo_avulso_test_tutorial.egg-info/dependency_links.txt
172+
reading manifest file 'codigo_avulso_test_tutorial.egg-info/SOURCES.txt'
173+
writing manifest file 'codigo_avulso_test_tutorial.egg-info/SOURCES.txt'
174+
warning: sdist: standard file not found: should have one of README, README.rst, README.txt
175+
176+
.
177+
.
178+
.
179+
180+
creating dist
181+
Creating tar archive
182+
removing 'codigo-avulso-test-tutorial-0.1.1' (and everything under it)
183+
running upload
184+
Submitting dist/codigo-avulso-test-tutorial-0.1.1.tar.gz to https://testpypi.python.org/pypi
185+
Server response (200): OK
186+
187+
```
188+
189+
#### Enviando para PyPI Live
190+
191+
Agora é pra valer. Executamos o mesmo passos para o [PyPI Test](https://testpypi.python.org/pypi).
192+
193+
```bash
194+
python setup.py register -r pypi
195+
```
196+
197+
Tudo ocorrendo bem, enviamos nosso pacote:
198+
199+
```bash
200+
python setup.py sdist upload -r pypi
201+
```
202+
203+
Parabéns! Com esse ultimo passo, publicamos o nosso pacote Python com sucesso! Agora ele pode ser [visualizado na lista de aplicações](https://pypi.python.org/pypi/codigo-avulso-test-tutorial/0.1.1) do [PyPI](https://pypi.python.org/pypi) e ser instalado usando `pip`.
204+
205+
```bash
206+
pip install nomedopacote
207+
```
208+
209+
Ou, para o nosso exemplo:
210+
211+
```bash
212+
pip install codigo_avulso_test_tutorial
213+
```
214+
215+
### Conclusão
216+
217+
É isso pessoal. Neste tutorial vimos como distribuir nossa aplicação Python, desde a crição na conta no [PyPI](https://pypi.python.org/pypi) até o registro e *upload* da nossa aplicação. Espero que tenham gostado e caso tenham alguma dúvida, deixem um comentário.
218+
219+
Obrigado pela leitura e até o próximo tutorial.
220+
221+
### Referências
222+
223+
* [Documentação oficial](https://wiki.python.org/moin/CheeseShopTutorial#Submitting_Packages_to_the_Package_Index)
224+
* [How to Host your Python Package on PyPI with GitHub](https://www.codementor.io/python/tutorial/host-your-python-package-using-github-on-pypi)
225+
* [How to submit a package to PyPI](http://peterdowns.com/posts/first-time-with-pypi.html)
130 KB
Loading

0 commit comments

Comments
 (0)