Wiele modułów Pythona innych firm ma atrybut, który przechowuje informacje o wersji modułu (zwykle coś w rodzaju module.VERSION
lub module.__version__
), jednak niektóre go nie mają.
Konkretnymi przykładami takich modułów są libxslt i libxml2.
Muszę sprawdzić, czy w czasie wykonywania jest używana poprawna wersja tych modułów. Czy jest na to sposób?
Potencjalnym rozwiązaniem byłoby odczytanie źródła w czasie wykonywania, zaszyfrowanie go, a następnie porównanie z hashem znanej wersji, ale to paskudne.
Czy są lepsze rozwiązania?
pkg_resources
wybrać inną wersję, cieniując tę, którą aktualnie używasz, ponieważ ma ona wyższy priorytet nad TwojąPYTHONPATH
lub podobną.__version__
atrybut: stackoverflow.com/q/17583443/562769pkg_resources
link to błąd 404Jakieś pomysły:
źródło
Możesz użyć
aby zobaczyć zainstalowane pakiety w formacie wymagań.
źródło
Możesz
importlib_metadata
do tego użyć biblioteki.Jeśli korzystasz z Pythona <
3.8
, najpierw zainstaluj go za pomocą:Ponieważ python
3.8
jest zawarty w standardowej bibliotece Pythona.Następnie, aby sprawdzić wersję pakietu (w tym przykładzie
lxml
), wykonaj:Należy pamiętać, że działa to tylko dla pakietów zainstalowanych z PyPI. Ponadto musisz przekazać nazwę pakietu jako argument
version
metody, a nie nazwę modułu, który ten pakiet zapewnia (chociaż zwykle są takie same).źródło
Uważam, że używanie różnych dostępnych narzędzi (w tym najlepszego
pkg_resources
wymienionego w tej drugiej odpowiedzi ) jest dość zawodne , ponieważ większość z nich nie obejmuje wszystkich przypadków. Na przykładPonieważ potrzebowaliśmy niezawodnego sposobu na uzyskanie wersji dowolnego pakietu, modułu lub podmodułu, napisałem getversion . Jest dość prosty w użyciu:
Szczegółowe informacje można znaleźć w dokumentacji .
źródło
Dla modułów, które nie zapewniają
__version__
następujących elementów, jest brzydki, ale działa:lub
źródło