La risposta breve è che requirements.txt
serve solo per elencare i requisiti del pacchetto. setup.py
d'altra parte è più simile a uno script di installazione. Se non prevedi di installare il codice python, in genere ti servirà solo requirements.txt
.
Il file setup.py
descrive, oltre alle dipendenze del pacchetto, l'insieme di file e moduli che dovrebbero essere impacchettati (o compilati, nel caso di moduli nativi (cioè, scritti in C)) e metadati da aggiungere agli elenchi dei pacchetti python ( es. nome del pacchetto, versione del pacchetto, descrizione del pacchetto, autore, ...).
Poiché entrambi i file elencano le dipendenze, ciò può portare a un po 'di duplicazione. Leggi sotto per i dettagli.
requirements.txt
Questo file elenca i requisiti del pacchetto Python. È un file di testo semplice (facoltativamente con commenti) che elenca le dipendenze del pacchetto del tuo progetto Python (uno per riga). Essa non descrive il modo in cui è installato il pacchetto python. In genere si utilizza il file dei requisiti con pip install -r requirements.txt
.
Il nome del file di testo è arbitrario, ma spesso lo è requirements.txt
per convenzione. Quando esplori i repository di codice sorgente di altri pacchetti Python, potresti incappare in altri nomi, come dev-dependencies.txt
o dependencies-dev.txt
. Quelli hanno lo stesso scopo dependencies.txt
ma generalmente elencano dipendenze aggiuntive di interesse per gli sviluppatori di un particolare pacchetto, vale a dire per testare il codice sorgente (es. Pytest, pylint, ecc.) Prima del rilascio. Gli utenti del pacchetto in genere non avrebbero bisogno dell'intero set di dipendenze dello sviluppatore per eseguire il pacchetto.
Se requirements-X.txt
sono presenti più varianti, di solito una elencherà le dipendenze di runtime e l'altra il tempo di compilazione o le dipendenze di test. Alcuni progetti mettono in cascata anche il loro file dei requisiti, cioè quando un file dei requisiti include un altro file ( esempio ). Ciò può ridurre la ripetizione.
setup.py
Questo è uno script python che utilizza il setuptools
modulo per definire un pacchetto python (nome, file inclusi, metadati del pacchetto e installazione). Sarà, come requirements.txt
, anche l'elenco runtime dipendenze del pacchetto. Setuptools è il modo di fatto per compilare e installare pacchetti python, ma ha i suoi difetti, che nel tempo hanno portato allo sviluppo di nuovi "meta-package manager", come pip. Esempi di difetti di setuptools sono la sua incapacità di installare più versioni dello stesso pacchetto e la mancanza di un comando di disinstallazione.
Quando un utente python fa pip install ./pkgdir_my_module
(o pip install my-module
), pip verrà eseguito setup.py
nella directory (o modulo) data. Allo stesso modo, qualsiasi modulo che ha un setup.py
può essere pip
installato, ad esempio eseguendolo pip install .
dalla stessa cartella.
Ho davvero bisogno di entrambi?
La risposta breve è no, ma è bello averli entrambi. Raggiungono scopi diversi, ma possono essere utilizzati entrambi per elencare le dipendenze.
C'è un trucco che potresti prendere in considerazione per evitare di duplicare il tuo elenco di dipendenze tra requirements.txt
e setup.py
. Se hai già scritto un file completamente funzionante setup.py
per il tuo pacchetto e le tue dipendenze sono per lo più esterne, potresti considerare di avere un semplice requirements.txt
con solo quanto segue:
# 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)
# .
È un'opzione -e
speciale pip install
che installa il pacchetto specificato in modalità modificabile . Quando pip -r requirements.txt
viene eseguito su questo file, pip installerà le tue dipendenze tramite l'elenco in ./setup.py
. L'opzione modificabile inserirà un collegamento simbolico nella directory di installazione (invece di un uovo o una copia archiviata). Consente agli sviluppatori di modificare il codice in posizione dal repository senza reinstallarlo.
Puoi anche trarre vantaggio da ciò che viene chiamato "setuptools extra" quando hai entrambi i file nel repository dei pacchetti. Puoi definire pacchetti opzionali in setup.py in una categoria personalizzata e installare quei pacchetti solo da quella categoria con pip:
# setup.py
from setuptools import setup
setup(
name="FOO"
...
extras_require = {
'dev': ['pylint'],
'build': ['requests']
}
...
)
e poi, nel file dei requisiti:
# install packages in the [build] category, from setup.py
# (path/to/mypkg is the directory where setup.py is)
-e path/to/mypkg[build]
Ciò manterrebbe tutti i tuoi elenchi di dipendenze all'interno di setup.py.
Nota : normalmente eseguiresti pip e setup.py da una sandbox, come quelle create con il programma virtualenv
. Ciò eviterà di installare pacchetti Python fuori dal contesto dell'ambiente di sviluppo del progetto.