Kiedy robię zamrożenie pip, widzę dużą liczbę pakietów Pythona, których nie zainstalowałem jawnie, np
$ pip freeze
Cheetah==2.4.3
GnuPGInterface==0.3.2
Landscape-Client==11.01
M2Crypto==0.20.1
PAM==0.4.2
PIL==1.1.7
PyYAML==3.09
Twisted-Core==10.2.0
Twisted-Web==10.2.0
(etc.)
Czy istnieje sposób, aby określić, dlaczego pip zainstalował te konkretne pakiety zależne? Innymi słowy, jak określić pakiet nadrzędny, który miał te pakiety jako zależności?
Na przykład mogę chcieć użyć Twisted i nie chcę polegać na pakiecie, dopóki nie dowiem się więcej o tym, jak go przypadkowo nie odinstalować lub zaktualizować.
pipdeptree -r
„Pokazuje drzewo zależności w odwrotnej kolejności, tj. Pod-zależności są wymienione wraz z listą pakietów, które ich potrzebują”.pipdeptree
jest świetne. Niestety wydaje się, że nie bierze pod uwagę zależności pakietów zainstalowanych przez conda: np. W conda env, gdziematplotlib
inumpy
zostały zainstalowane przy użyciu pip, alescipy
zostało zainstalowane przy użyciu conda,scipy
pojawia się w pipdeptree jako bez zależności i bez zależności (równieżpip show scipy
pokazuje brak wymagania).python -m pipdeptree
inaczej (nawet jeśli plik wykonywalny jest zainstalowany w virtualenv), wyświetla tylko zależności systemowe.pip show
Komenda pokaże jakie pakiety są wymagane dla określonego pakietu (zauważ, że określony pakiet musi być zainstalowany):pip show
został wprowadzony w wersji pip 1.4rc5źródło
pip show
został wprowadzony w wersji 1.4rc5 i jest obecny w (aktualnym w momencie pisania) 1.4.1pip freeze | grep -v "\-e" | sed s/\=\=.*// | awk 'system("pip show " $1)' | grep -E '^(Name:|Requires:)' | sed s/Name:/\\\nName:/
- ale wydaje się, że pipdeptree jest teraz lepszym rozwiązaniem.Jak niedawno powiedziałem w wątku hn , polecam:
Przygotuj skomentowany
requirements.txt
plik z głównymi zależnościami:Instalować zależności:
pip install -r requirements.txt
. Teraz masz pełną listę swoich zależności zpip freeze -r requirements.txt
:Pozwala to zachować strukturę plików z komentarzami, ładnie oddzielając zależności od zależności zależności. W ten sposób będziesz mieć dużo przyjemniejszy czas w dniu, w którym musisz usunąć jeden z nich :)
Zwróć uwagę na następujące kwestie:
requirements.raw
z kontrolą wersji, aby odbudować pełną wersjęrequirements.txt
.pip install --no-install <package_name>
do wyświetlania określonych wymagań.źródło
pip freeze -r requirements.txt
nie jest to powszechnie używane. Bardzo przydatne do utrzymywania zależności i zależności podrzędnych.pip install
już nie obsługuje--no-install
.Możesz także użyć polecenia jednowierszowego, które przesyła pakiety w wymaganiach do programu pip show.
źródło
<package_name>==<package_version>
.Przede wszystkim
pip freeze
wyświetla wszystkie aktualnie zainstalowane pakiety Python, niekoniecznie używając PIP.Po drugie, pakiety Pythona zawierają informacje o pakietach zależnych, a także o wymaganych wersjach . Zależności poszczególnych pakietów można zobaczyć, korzystając z metod opisanych tutaj . Podczas aktualizacji pakietu skrypt instalacyjny, taki jak PIP, zajmie się aktualizacją zależności za Ciebie.
Aby rozwiązać aktualizację pakietów, zalecam używanie plików wymagań PIP . Możesz zdefiniować potrzebne pakiety i wersje i zainstalować je od razu za pomocą pip install.
źródło
Użyj pipupgrade !
pipupgrade wyświetla wykres zależności i wyróżnia każdy pakiet pod kątem możliwej aktualizacji (na podstawie wersji semantycznej). W ładny sposób wyświetla również sprzeczne zależności potomne.
pipupgrade
zapewnia również aktualizację pakietów obecnych w wielu środowiskach Pythona. Kompatybilny z Python2.7 +, Python3.4 + i pip9 +, pip10 +, pip18 +, pip19 +.źródło
(obejście, nieprawda odpowiedź)
Miałem ten sam problem, kiedy lxml się nie instalował, a ja chciałem wiedzieć, kto potrzebuje lxml. Nie kto potrzebował LXML . Skończyło się na omijaniu problemu przez.
odnotowując, gdzie są umieszczane moje pakiety witryny.
idź tam i rekurencyjnie grep do importu (ostatnie polecenie --invert-match grepa służy do usunięcia z rozważenia własnych plików lxml).
Tak, nie jest to odpowiedź na pytanie, jak używać pip do tego celu, ale z jakiegoś powodu nie odniosłem żadnego sukcesu z przedstawionych tutaj sugestii.
źródło
Napisałem szybki skrypt, aby rozwiązać ten problem. Poniższy skrypt wyświetli pakiet nadrzędny (zależny) dla danego pakietu. W ten sposób możesz mieć pewność, że aktualizacja lub instalacja dowolnego konkretnego pakietu jest bezpieczna. Można go używać w następujący sposób:
dependants.py PACKAGENAME
źródło
get_installed_distributions()
metoda nie jest już dostępna. github.com/pypa/pip/issues/5243