A resposta curta requirements.txt
é para listar apenas os requisitos do pacote. setup.py
por outro lado, é mais como um script de instalação. Se você não planeja instalar o código python, normalmente você só precisa requirements.txt
.
O arquivo setup.py
descreve, além das dependências do pacote, o conjunto de arquivos e módulos que devem ser empacotados (ou compilados, no caso de módulos nativos (ou seja, escritos em C)) e metadados para adicionar às listagens de pacotes python ( por exemplo, nome do pacote, versão do pacote, descrição do pacote, autor, ...).
Como os dois arquivos listam dependências, isso pode causar um pouco de duplicação. Leia abaixo para obter detalhes.
requisitos.txt
Este arquivo lista os requisitos do pacote Python. É um arquivo de texto simples (opcionalmente com comentários) que lista as dependências do pacote do seu projeto Python (uma por linha). Ele não descrever a maneira em que seu pacote python está instalado. Você geralmente consumiria o arquivo de requisitos com pip install -r requirements.txt
.
O nome do arquivo de texto é arbitrário, mas geralmente é requirements.txt
por convenção. Ao explorar repositórios de código-fonte de outros pacotes Python, você pode topar com outros nomes, como dev-dependencies.txt
ou dependencies-dev.txt
. Eles têm a mesma finalidade, dependencies.txt
mas geralmente listam dependências adicionais de interesse para os desenvolvedores do pacote específico, a saber, para testar o código-fonte (por exemplo, pytest, pylint, etc.) antes do lançamento. Os usuários do pacote geralmente não precisam de todo o conjunto de dependências do desenvolvedor para executar o pacote.
Se várias requirements-X.txt
variantes estiverem presentes, geralmente uma listará as dependências de tempo de execução e a outra de tempo de construção ou dependências de teste. Alguns projetos também distribuem seus arquivos de requisitos em cascata, ou seja, quando um arquivo de requisitos inclui outro arquivo ( exemplo ). Isso pode reduzir a repetição.
setup.py
Este é um script Python que usa o setuptools
módulo para definir um pacote Python (nome, arquivos incluídos, metadados do pacote e instalação). Irá, como requirements.txt
, também listar dependências de tempo de execução do pacote. Setuptools é a maneira de fato de construir e instalar pacotes Python, mas tem suas deficiências, que com o tempo geraram o desenvolvimento de novos "gerenciadores de meta-pacotes", como o pip. As deficiências de exemplo das ferramentas de instalação são a incapacidade de instalar várias versões do mesmo pacote e a falta de um comando de desinstalação.
Quando um usuário Python faz pip install ./pkgdir_my_module
(ou pip install my-module
), o pip será executado setup.py
no diretório (ou módulo) fornecido. Da mesma forma, qualquer módulo que tenha um setup.py
pode ser pip
instalado, por exemplo, executando a pip install .
partir da mesma pasta.
Eu realmente preciso de ambos?
A resposta curta é não, mas é bom ter os dois. Eles alcançam finalidades diferentes, mas podem ser usados para listar suas dependências.
Há um truque que você pode considerar para evitar a duplicação de sua lista de dependências entre requirements.txt
e setup.py
. Se você já escreveu um totalmente funcional setup.py
para o seu pacote e suas dependências são principalmente externas, você pode considerar ter um simples requirements.txt
com apenas o seguinte:
# requirements.txt
#
# installs dependencies from ./setup.py, and the package itself,
# in editable mode
-e .
# (the -e above is optional). you could also just install the package
# normally with just the line below (after uncommenting)
# .
O -e
é uma pip install
opção especial que instala o pacote fornecido em modo editável . Quando pip -r requirements.txt
for executado neste arquivo, o pip instalará suas dependências por meio da lista em ./setup.py
. A opção editável colocará um link simbólico em seu diretório de instalação (em vez de um ovo ou cópia arquivada). Ele permite que os desenvolvedores editem o código no local do repositório sem reinstalar.
Você também pode tirar proveito do que é chamado de "extras de ferramentas de instalação" quando você tem ambos os arquivos em seu repositório de pacotes. Você pode definir pacotes opcionais em setup.py em uma categoria personalizada e instalar esses pacotes apenas dessa categoria com pip:
# setup.py
from setuptools import setup
setup(
name="FOO"
...
extras_require = {
'dev': ['pylint'],
'build': ['requests']
}
...
)
e então, no arquivo de requisitos:
# install packages in the [build] category, from setup.py
# (path/to/mypkg is the directory where setup.py is)
-e path/to/mypkg[build]
Isso manteria todas as suas listas de dependências dentro de setup.py.
Observação : você normalmente executaria pip e setup.py a partir de uma sandbox, como as criadas com o programa virtualenv
. Isso evitará a instalação de pacotes Python fora do contexto do ambiente de desenvolvimento do seu projeto.