Krótka odpowiedź jest taka, że requirements.txtwystarczy wymienić wymagania dotyczące pakietu. setup.pyz drugiej strony bardziej przypomina skrypt instalacyjny. Jeśli nie planujesz instalowania kodu w Pythonie, zwykle potrzebujesz tylko requirements.txt.
Plik setup.pyopisuje, 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.txtz konwencji. Podczas eksploracji repozytoriów kodu źródłowego innych pakietów Pythona możesz natknąć się na inne nazwy, takie jak dev-dependencies.txtlub dependencies-dev.txt. Służą one temu samemu celowi, dependencies.txtale 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.txtistnieje 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 setuptoolsmoduł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.pyw podanym katalogu (lub module). Podobnie każdy moduł, który posiada, setup.pymożna pipzainstalować, 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.txti setup.py. Jeśli napisałeś już w pełni działającą wersję setup.pydla swojego pakietu, a twoje zależności są w większości zewnętrzne, możesz rozważyć prostą, requirements.txtzawierają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)
# .
-eTo specjalna pip installopcja, która instaluje dany pakiet w edycji trybu. Po pip -r requirements.txturuchomieniu 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.