Krótka odpowiedź jest taka, że requirements.txt
wystarczy wymienić wymagania dotyczące pakietu. setup.py
z drugiej strony bardziej przypomina skrypt instalacyjny. Jeśli nie planujesz instalowania kodu w Pythonie, zwykle potrzebujesz tylko requirements.txt
.
Plik setup.py
opisuje, oprócz zależności pakietu, zestaw plików i modułów, które powinny być spakowane (lub skompilowane, w przypadku modułów natywnych (tj. Napisane w C)) oraz metadane, które należy dodać do listy pakietów pythona ( np. nazwa pakietu, wersja pakietu, opis pakietu, autor, ...).
Ponieważ oba pliki zawierają zależności, może to prowadzić do pewnego powielenia. Przeczytaj poniżej, aby uzyskać szczegółowe informacje.
wymagania.txt
Ten plik zawiera listę wymagań dotyczących pakietów Pythona. Jest to zwykły plik tekstowy (opcjonalnie z komentarzami), który zawiera listę zależności pakietów projektu w języku Python (po jednym w każdym wierszu). Tak nie jest opisują sposób, w którym został zainstalowany pakiet python. Zwykle zużywałbyś plik wymagań z rozszerzeniem pip install -r requirements.txt
.
Nazwa pliku tekstowego jest dowolna, ale często wynika requirements.txt
z konwencji. Podczas eksploracji repozytoriów kodu źródłowego innych pakietów Pythona możesz natknąć się na inne nazwy, takie jak dev-dependencies.txt
lub dependencies-dev.txt
. Służą one temu samemu celowi, dependencies.txt
ale generalnie zawierają listę dodatkowych zależności interesujących deweloperów danego pakietu, mianowicie do testowania kodu źródłowego (np. Pytest, pylint itp.) Przed wydaniem. Użytkownicy pakietu na ogół nie potrzebowaliby całego zestawu zależności programisty do uruchomienia pakietu.
Jeśli requirements-X.txt
istnieje wiele wariantów, zwykle jeden będzie zawierał listę zależności środowiska wykonawczego, a drugi czas kompilacji lub zależności testowe. Niektóre projekty również kaskadowo tworzą swój plik wymagań, tj. Gdy jeden plik wymagań zawiera inny plik ( np ). Może to zmniejszyć liczbę powtórzeń.
setup.py
To jest skrypt w języku Python, który używa setuptools
modułu do zdefiniowania pakietu w języku Python (nazwa, dołączone pliki, metadane pakietu i instalacja). Będzie on, podobnie requirements.txt
, wyświetlał również listę zależności wykonawczych pakietu. Setuptools to de facto sposób budowania i instalowania pakietów Pythona, ale ma on swoje wady, które z czasem spowodowały rozwój nowych „menedżerów metapakietów”, takich jak pip. Przykładowe wady setuptools to brak możliwości zainstalowania wielu wersji tego samego pakietu oraz brak polecenia odinstalowania.
Gdy użytkownik Pythona to zrobi pip install ./pkgdir_my_module
(lub pip install my-module
), pip będzie działał setup.py
w podanym katalogu (lub module). Podobnie każdy moduł, który posiada, setup.py
można pip
zainstalować, np. Uruchamiając pip install .
z tego samego folderu.
Czy naprawdę potrzebuję obu?
Krótka odpowiedź brzmi: nie, ale dobrze jest mieć jedno i drugie. Osiągają różne cele, ale oba mogą być używane do tworzenia listy zależności.
Jest jedna sztuczka, którą możesz rozważyć, aby uniknąć powielania listy zależności między requirements.txt
i setup.py
. Jeśli napisałeś już w pełni działającą wersję setup.py
dla swojego pakietu, a twoje zależności są w większości zewnętrzne, możesz rozważyć prostą, requirements.txt
zawierającą tylko następujące elementy:
# 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)
# .
-e
To specjalna pip install
opcja, która instaluje dany pakiet w edycji trybu. Po pip -r requirements.txt
uruchomieniu na tym pliku pip zainstaluje Twoje zależności za pośrednictwem listy w ./setup.py
. Opcja edytowalna umieści łącze symboliczne w katalogu instalacyjnym (zamiast jajka lub zarchiwizowanej kopii). Umożliwia programistom edycję kodu w miejscu z repozytorium bez ponownej instalacji.
Możesz także skorzystać z tego, co nazywa się „dodatkami setuptools”, gdy masz oba pliki w repozytorium pakietów. Możesz zdefiniować opcjonalne pakiety w setup.py w niestandardowej kategorii i zainstalować te pakiety tylko z tej kategorii za pomocą pip:
# setup.py
from setuptools import setup
setup(
name="FOO"
...
extras_require = {
'dev': ['pylint'],
'build': ['requests']
}
...
)
a następnie w pliku wymagań:
# install packages in the [build] category, from setup.py
# (path/to/mypkg is the directory where setup.py is)
-e path/to/mypkg[build]
Spowodowałoby to zachowanie wszystkich list zależności wewnątrz setup.py.
Uwaga : pip i setup.py zwykle uruchamiasz z piaskownicy, takiej jak te utworzone za pomocą programu virtualenv
. Pozwoli to uniknąć instalowania pakietów Pythona poza kontekstem środowiska programistycznego projektu.