Como ninguém cobriu ainda esta questão do OP:
O que eu queria fazer:
Torne um módulo python instalável com "pip install ..."
Aqui está um exemplo mínimo absoluto, mostrando as etapas básicas de preparação e upload do seu pacote para o PyPI usando setuptools
e twine
.
Isso não substitui a leitura de pelo menos o tutorial ; há muito mais do que abordado neste exemplo muito básico.
A criação do pacote em si já é abordada por outras respostas aqui, portanto, vamos assumir que temos essa etapa coberta e nossa estrutura de projeto como esta:
.
└── hellostackoverflow/
├── __init__.py
└── hellostackoverflow.py
Para usar setuptools
no empacotamento, precisamos adicionar um arquivo setup.py
, que vai para a pasta raiz do nosso projeto:
.
├── setup.py
└── hellostackoverflow/
├── __init__.py
└── hellostackoverflow.py
No mínimo, especificamos os metadados para o nosso pacote, e setup.py
ficaria assim:
from setuptools import setup
setup(
name='hellostackoverflow',
version='0.0.1',
description='a pip-installable package example',
license='MIT',
packages=['hellostackoverflow'],
author='Benjamin Gerfelder',
author_email='benjamin.gerfelder@gmail.com',
keywords=['example'],
url='https://github.com/bgse/hellostackoverflow'
)
Desde que configuramos license='MIT'
, incluímos uma cópia em nosso projeto como LICENCE.txt
, juntamente com um arquivo leia-me em reStructuredText como README.rst
:
.
├── LICENCE.txt
├── README.rst
├── setup.py
└── hellostackoverflow/
├── __init__.py
└── hellostackoverflow.py
Neste ponto, estamos prontos para começar a empacotar usando setuptools
, se ainda não o tivermos instalado, podemos instalá-lo com pip
:
pip install setuptools
Para fazer isso e criar uma source distribution
, em nossa pasta raiz do projeto, chamamos nossa a setup.py
partir da linha de comando, especificando que queremos sdist
:
python setup.py sdist
Isso criará nosso pacote de distribuição e informações sobre o ovo e resultará em uma estrutura de pastas como esta, com nosso pacote em dist
:
.
├── dist/
├── hellostackoverflow.egg-info/
├── LICENCE.txt
├── README.rst
├── setup.py
└── hellostackoverflow/
├── __init__.py
└── hellostackoverflow.py
Neste ponto, temos um pacote que podemos instalar usando pip
, portanto, a partir da raiz do nosso projeto (assumindo que você tenha toda a nomeação como neste exemplo):
pip install ./dist/hellostackoverflow-0.0.1.tar.gz
Se tudo correr bem, agora podemos abrir um intérprete Python, eu diria em algum lugar fora do diretório do projeto para evitar qualquer confusão e tentar usar nosso novo pacote:
Python 3.5.2 (default, Sep 14 2017, 22:51:06)
[GCC 5.4.0 20160609] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> from hellostackoverflow import hellostackoverflow
>>> hellostackoverflow.greeting()
'Hello Stack Overflow!'
Agora que confirmamos a instalação e o funcionamento do pacote, podemos carregá-lo no PyPI.
Como não queremos poluir o repositório ativo com nossos experimentos, criamos uma conta para o repositório de teste e instalamos twine
o processo de upload:
pip install twine
Agora estamos quase lá, com a nossa conta criada, simplesmente pedimos twine
para fazer o upload do nosso pacote, ele solicitará nossas credenciais e fará o upload do pacote no repositório especificado:
twine upload --repository-url https://test.pypi.org/legacy/ dist/*
Agora podemos fazer login em nossa conta no repositório de teste do PyPI e nos maravilhar com nosso pacote recém-carregado por um tempo, e depois pegá-lo usando pip
:
pip install --index-url https://test.pypi.org/simple/ hellostackoverflow
Como podemos ver, o processo básico não é muito complicado. Como eu disse anteriormente, há muito mais do que o abordado aqui, então vá em frente e leia o tutorial para obter uma explicação mais aprofundada.