Jak sprawdzisz, czy pakiet jest w najnowszej wersji programowo w skrypcie, i zwróci prawdę, czy fałsz?
Mogę sprawdzić za pomocą takiego skryptu:
package='gekko'
import pip
if hasattr(pip, 'main'):
from pip import main as pipmain
else:
from pip._internal import main as pipmain
pipmain(['search','gekko'])
lub z linii poleceń:
(base) C:\User>pip search gekko
gekko (0.2.3) - Machine learning and optimization for dynamic systems
INSTALLED: 0.2.3 (latest)
Ale jak sprawdzać programowo i zwracać wartość prawda lub fałsz?
pip
nie ma interfejsu API. Możesz obejrzećpip-api
projekt, ale nie ma tam jeszcze wiele.Odpowiedzi:
Szybka wersja (tylko sprawdzanie pakietu)
Poniższy kod wywołuje pakiet z niedostępną wersją, taką jak
pip install package_name==random
. Połączenie zwraca wszystkie dostępne wersje. Program czyta najnowszą wersję.Następnie program uruchamia się
pip show package_name
i pobiera bieżącą wersję pakietu.Jeśli znajdzie dopasowanie, zwraca wartość Prawda, w przeciwnym razie Fałsz.
Jest to niezawodna opcja, biorąc pod uwagę, że trwa
pip
Następujący kod wymaga
pip list --outdated
:źródło
if (boolean): return True else: return False
lepiej jest po prostureturn boolean
pip install p==0
na przykład).random
Jestem pewien, że nie ma losowej wersjiMój projekt
johnnydep
ma tę funkcję.W skorupkach:
W Pythonie:
źródło
Edycja: Usuń wyszukiwanie pip
Dziękuję za kilka sugestii. Oto nowa wersja, która nie korzysta,
pip search
ale pobiera najnowszą wersję bezpośrednio zpypi
propozycji Daniela Hilla . To rozwiązuje również problem z fałszywymi dopasowaniami podłańcucha.Oryginalna odpowiedź
Oto szybkie rozwiązanie, które pobiera informacje o najnowszej wersji tylko
gekko
o interesującym pakiecie.Spowoduje to wyświetlenie komunikatu
Latest version (0.2.3) of gekko is installed
i powrótTrue
do wskazania najnowszej wersji (lubFalse
jeśli nie najnowszej wersji). To może nie być najlepsze rozwiązanie, ponieważ sprawdza tylko podciąg wersji,if d[name] in s.decode():
ale jest szybszy niżpip list --outdated
wszystkie pakiety. Nie jest to najbardziej niezawodna metoda, ponieważ zwróci ona nieprawidłową wartość,True
jeśli bieżąca wersja jest zainstalowana,0.2.3
ale najnowsza wersja to0.2.30
lub0.2.3a
. Ulepszeniem byłoby programowo uzyskanie najnowszej wersji i bezpośrednie porównanie.źródło
pip search
. Używa przestarzałego interfejsu API XML-RPC, a czasem wyniki wyszukiwania są niedokładne / niepoprawne. Właściwie myślę, że może zostać wkrótce usunięte, zobacz Polecenie usuwania pip search # 5216 .import gekko
a następniecurrent_version=gekko.__version__
utworzenie słownika wszystkich wersji pakietów. Jednak nie wszystkie pakiety mają numer wersji dostępny w pakiecie.Ostatnia wersja:
Mój projekt
luddite
ma tę funkcję:Zainstalowana wersja:
Kanonicznym sposobem sprawdzenia zainstalowanej wersji jest po prostu dostęp do
__version__
atrybutu przestrzeni nazw najwyższego poziomu:Niestety nie wszystkie projekty ustawiają ten atrybut. Jeśli nie, możesz użyć,
pkg_resources
aby wykopać je z metadanych:źródło
To powinno załatwić sprawę przynajmniej w celach demonstracyjnych. Po prostu zadzwoń
isLatestVersion
z nazwą pakietu, który chcesz sprawdzić. Jeśli używasz tego gdzieś ważnego, chciałbyś spróbować złapać żądanie adresu URL, ponieważ dostęp do Internetu może być niedostępny. Pamiętaj również, że jeśli pakiet nie jest zainstalowanyisLatestVersion
zostanie , zwróci False.Jest to testowane dla Pythona 3.7.4 i Pip 19.0.3.
źródło
pip._internal
nie jest publicznym API. Dokumenty pipa wyraźnie odradzają nawet : „ nie wolno używać wewnętrznych interfejsów API pip w ten sposób ”.Nie jest trudno napisać prosty skrypt samodzielnie, sprawdzając API PyPI . W najnowszym Pythonie 3.8 możliwe jest używanie tylko standardowej biblioteki (w przypadku Pythona w wersji 3.7 lub starszej będziesz musiał zainstalować
importlib_metadata
backport):Przykład użycia:
Jeśli akurat masz
packaging
zainstalowany, jest to lepsza alternatywadistutils.version
dla analizy wersji:staje się
źródło