Jak mogę uzyskać listę lokalnie zainstalowanych modułów Python?


996

Chciałbym uzyskać listę modułów Python, które są w mojej instalacji Python (serwer UNIX).

Jak uzyskać listę modułów Python zainstalowanych na komputerze?


77
możesz po prostu >>> help (), a następnie >>> moduły
Julius Naeumann

1
Czy jest alternatywa? help () wisi dla mnie.
Paulo Carvalho

2
Wiele z tych odpowiedzi zakłada, że ​​masz dostęp do wiersza poleceń. Jeśli używasz AWS Lambda, musisz zrobić to wszystko z poziomu Pythona. Zobacz stackoverflow.com/a/54939905/117471
Bruno Bronosky

Odpowiedzi:


610

Rozwiązanie

Nie używaj z pipem> 10,0!

Moje 50 centów za uzyskanie pip freezepodobnej listy ze skryptu Python:

import pip
installed_packages = pip.get_installed_distributions()
installed_packages_list = sorted(["%s==%s" % (i.key, i.version)
     for i in installed_packages])
print(installed_packages_list)

Jako (za długa) jedna wkładka:

sorted(["%s==%s" % (i.key, i.version) for i in pip.get_installed_distributions()])

Dający:

['behave==1.2.4', 'enum34==1.0', 'flask==0.10.1', 'itsdangerous==0.24', 
 'jinja2==2.7.2', 'jsonschema==2.3.0', 'markupsafe==0.23', 'nose==1.3.3', 
 'parse-type==0.3.4', 'parse==1.6.4', 'prettytable==0.7.2', 'requests==2.3.0',
 'six==1.6.1', 'vioozer-metadata==0.1', 'vioozer-users-server==0.1', 
 'werkzeug==0.9.4']

Zakres

To rozwiązanie stosuje się do zakresu systemu lub zakresu wirtualnego środowiska i obejmuje pakiety instalowane setuptools, piporaz ( nie daj Boże ) easy_install.

Mój przypadek użycia

Dodałem wynik tego wywołania do mojego serwera flask, więc kiedy go http://example.com/exampleServer/environmentwywołuję, otrzymuję listę pakietów zainstalowanych na virtualenv serwera. Ułatwia to debugowanie.

Ostrzeżenia

Zauważyłem dziwne zachowanie tej techniki - gdy interpreter Pythona jest wywoływany w tym samym katalogu co setup.pyplik, nie wyświetla pakietu zainstalowanego przez setup.py.

Kroki ku reprodukcji:

Utwórz wirtualne środowisko
$ cd /tmp
$ virtualenv test_env
New python executable in test_env/bin/python
Installing setuptools, pip...done.
$ source test_env/bin/activate
(test_env) $ 
Sklonuj repozytorium git za pomocą setup.py
(test_env) $ git clone https://github.com/behave/behave.git
Cloning into 'behave'...
remote: Reusing existing pack: 4350, done.
remote: Total 4350 (delta 0), reused 0 (delta 0)
Receiving objects: 100% (4350/4350), 1.85 MiB | 418.00 KiB/s, done.
Resolving deltas: 100% (2388/2388), done.
Checking connectivity... done.

Zachowujemy się setup.pyw /tmp/behave:

(test_env) $ ls /tmp/behave/setup.py
/tmp/behave/setup.py
Zainstaluj pakiet python z repozytorium git
(test_env) $ cd /tmp/behave && pip install . 
running install
...
Installed /private/tmp/test_env/lib/python2.7/site-packages/enum34-1.0-py2.7.egg
Finished processing dependencies for behave==1.2.5a1

Jeśli uruchomimy wyżej wymienione rozwiązanie z /tmp

>>> import pip
>>> sorted(["%s==%s" % (i.key, i.version) for i in pip.get_installed_distributions()])
['behave==1.2.5a1', 'enum34==1.0', 'parse-type==0.3.4', 'parse==1.6.4', 'six==1.6.1']
>>> import os
>>> os.getcwd()
'/private/tmp'

Jeśli uruchomimy wyżej wymienione rozwiązanie z /tmp/behave

>>> import pip
>>> sorted(["%s==%s" % (i.key, i.version) for i in pip.get_installed_distributions()])
['enum34==1.0', 'parse-type==0.3.4', 'parse==1.6.4', 'six==1.6.1']
>>> import os
>>> os.getcwd()
'/private/tmp/behave'

behave==1.2.5a1brakuje drugim przykładzie, ponieważ katalog roboczy zawiera behave„s setup.pypliku.

W dokumentacji nie znalazłem żadnego odniesienia do tego problemu. Być może otworzę dla tego błąd.


5
Dziękuję za tę odpowiedź! Myślę, że lepiej odpowiedzieć na pytanie, ponieważ pytam „lokalnie” zainstalowane moduły Pythona. Zamrożenie pipa nie zawsze jest właściwą drogą. To działa lepiej - tak myślę.
Léo Léopold Hertz

3
@Masi Właśnie dodał szczegółowe wyjaśnienie dotyczące zastrzeżenia tego rozwiązania. To jest naprawdę dziwne.
Adam Matan

21
Alternatywa:import pkg_resources; installed_packages = [(d.project_name, d.version) for d in pkg_resources.working_set]
ebolyen

14
Począwszy od pip 10, ta odpowiedź nie będzie już działać. Komentarz od @ebolyen pokazuje alternatywne polecenia, które działają. Doszedłem do tego samego wniosku i zamieściłem poniżej pełny poprawiony kod.
Big_Al_Tx

5
W najnowszych wersjach pipa to nie działa, co powoduje wyświetlenie komunikatu o błędzie AttributeError: module 'pip' has no attribute 'get_installed_distributions'.
HelloGoodbye,


285

Teraz te metody wypróbowałem sam i dostałem dokładnie to, co było reklamowane: wszystkie moduły.

Niestety, naprawdę nie obchodzi cię stdlib, wiesz, co otrzymujesz z instalacją Pythona.

Naprawdę, chcę rzeczy, które mam zainstalowane.

Co zaskakujące, zadziałało dobrze:

pip freeze

Który zwrócił:

Fabric==0.9.3
apache-libcloud==0.4.0
bzr==2.3b4
distribute==0.6.14
docutils==0.7
greenlet==0.3.1
ipython==0.10.1
iterpipes==0.4
libxml2-python==2.6.21

Mówię „zaskakująco”, ponieważ narzędzie do instalowania pakietów jest dokładnie tym miejscem, w którym można się spodziewać tej funkcjonalności, chociaż nie pod nazwą „zamrozić”, ale opakowanie Pythona jest tak dziwne, że jestem zaskoczony, że to narzędzie ma sens. Pip 0.8.2, Python 2.7.


4
Myślę, że nazwa kryje się za tym, że otrzymujesz „zamrożoną” migawkę tego, co jest teraz zainstalowane, którą możesz później przesłać do pip, aby uzyskać dokładnie te same moduły zainstalowane w innym środowisku.
Ryan C. Thompson,

Arash, możesz także zainstalować pip w systemie Windows! Najpierw zainstaluj setuptools, a następnie użyj easy_install, aby zainstalować pip :)
gawbul

Jest to doskonałe, ale wydaje się, że brakuje niektórych zainstalowanych bibliotek. Na przykład nie wyświetla PyQt.
Junuxx

8
Począwszy od pip 1.3 istnieje polecenie list .
Piotr Dobrogost

to działa. Co to jest python bałagan. Dlaczego nie mogą zebrać się w sobie i wymyślić rozwiązań podobnych do tych, które istnieją w Railsach? (Gemfile, bundler, rvm)
Dimitris,

106

Od wersji PIP 1.3 masz dostęp do:

pip list

Który wydaje się być cukrem syntaktycznym do „zamrażania pip”. Spowoduje to wyświetlenie listy wszystkich modułów związanych z Twoją instalacją lub virtualenv, wraz z ich numerami wersji. Niestety nie wyświetla bieżącego numeru wersji żadnego modułu, ani nie myje naczyń ani nie połyskuje butów.


4
Istnieje również pip list --localmożliwość rozróżnienia między virtualenvglobalnymi pakietami witryn, omówionymi tutaj .
Ioannis Filippidis

1
Zdecydowanie najlepszy. Pobiera również wersje.
aerijman

pip listjest najprostszy i najlepszy. Oto opcje i szczegóły.
Levi Baguley,

86
  • W ipythonmożna wpisać „ importTab”.

  • W standardowym interpretatorze Pythona możesz wpisać „ help('modules')”.

  • W wierszu polecenia możesz użyć .pydoc modules

  • W skrypcie zadzwoń pkgutil.iter_modules().


5
pkgutil.iter_modules()działa, powyższe rozwiązanie pip nie wyświetla wszystkich pakietów, tylko te zainstalowane przez pip.
metaperture

2
Niesamowite! Myślę, że poprawili dokumentację, odkąd zadano to pytanie. Moduł pydoc spam przeszukuje spam w dokumentach modułów. Ostatni punkt wydaje się dostarczać wystarczających informacji do korzystania z modułu. @metaperture Czy możesz podać przykład, w jaki sposób wyświetlasz listę wszystkich zainstalowanych modułów lokalnych (a nie ogromną listę stlib przy pomocy („modułów”)) autorstwa pkgutil.iter_modules () .
Léo Léopold Hertz

2
@ LéoLéopoldHertz 준영 Spróbuj fragment: python -c 'import pkgutil;print [x[1] for x in list(pkgutil.iter_modules())]'. Powinien zrzucić wszystkie nazwy modułów jako jedną naprawdę dużą listę Pythona. x[1]Bit jest używany do wyrywania nazwę moduł z generowanych przez krotki pkgutil.iter_modules().
Philip Conrad,

76

Po prostu używam tego, aby zobaczyć aktualnie używane moduły:

import sys as s
s.modules.keys()

który pokazuje wszystkie moduły działające na twoim pythonie.

Do wszystkich wbudowanych modułów użyj:

s.modules

Który jest dyktorem zawierającym wszystkie moduły i importowane obiekty.


2
# Po zaimportowaniu sys „import sys as s” możesz wydrukować za pomocą: print sys.modules.keys ()
Dan Evans

Nie jestem pewien, dlaczego mój post był edytowany, ale dziękuję za skorzystanie z informacji, które opublikowałem, aby poprawić błędy we wcześniejszych postach. Zwrócisz błędy, jeśli użyjesz help () vs help (''). Dotyczy to również dir ('') i sys ('') itp. Mam nadzieję, że to pomaga i nie jest usuwane.
Dan Evans

Zignoruj ​​mój ostatni post, ten post nie był edytowany. Miałem na myśli podobny post znaleziony tutaj: stackoverflow.com/questions/139180/... Przepraszam za zamieszanie.
Dan Evans

7
Pozytywnie oceniany, ponieważ jest to jedyna metoda, która wydaje się działać na systemach z ograniczeniami, które nie mają ani pydocnie zostały pipzainstalowane (w moim przypadku NAS).
Thomas

1
Zgadzam się z Thomasem. Korzystam na przykład z repl.it, który jest również ograniczonym rodzajem środowiska. help('modules')po prostu wisi dla mnie bez odpowiedzi. Ale to podejście sysdziała doskonale
Sergiy Kolodyazhnyy

63

W normalnej powłoce po prostu użyj

pydoc modules

Wygląda na to, że powyższe działa tylko na platformach 'nix. W każdym razie znalazłem i uruchomiłem skrypt, dostosowując polecenie w następujący sposób: c: \ bin \ pythos_2.7 \ lib \ pydoc.py moduły - ta lista trwała wieczność, format jest do bani i pomija zainstalowaną wersję numer. Zdam
David A. Gray

2
@ DavidA.Gray Właśnie wypróbowałem to na komputerze z systemem Windows z Python 3, i faktycznie działa. Za pomocą programu uruchamiającego Windows w Pythonie możesz to zrobić py -m pydoc modulesw cmd lub PowerShell.
VKK

pydoc modulesnie działało dla mnie w Windows 10 z Python 3.6, ale modyfikacja @VKK: py -m pydoc modulesdziała w cmd / Powershell.
Martin

41

Począwszy od pip 10, zaakceptowana odpowiedź nie będzie już działać. Zespół programistów usunął dostęp do get_installed_distributionsprocedury. Istnieje inna funkcja setuptoolsdo robienia tego samego. Oto alternatywna wersja, która działa z pipem 10:

import pkg_resources
installed_packages = pkg_resources.working_set
installed_packages_list = sorted(["%s==%s" % (i.key, i.version)
     for i in installed_packages])
print(installed_packages_list)

Daj mi znać, czy będzie działać, czy też nie, w poprzednich wersjach pipa.


2
Szukałem tego rozwiązania i załamałem mózg, próbując znaleźć pkg_resources. Gdybym mógł to głosować więcej niż raz, zrobiłbym to. Dziękuję, @Big_Al_Tx! Aktualizacja: Z wyjątkiem .... kiedy wykonuję „zamrażanie pip” w moim środowisku wirtualnym i porównuję go z wynikiem tego, brakuje pakietów. Wszelkie przemyślenia na temat tego, dlaczego tak się mogło stać?
numberwhun

@numberwhun - Cieszę się, że to działało dla Ciebie. Przepraszam, ale nie mam odpowiedzi na rozbieżności z pip freeze; głębokość mojej wiedzy na ten temat jest raczej ograniczona. W pewnym sensie pogrzebałem drogę do rozwiązania, gdy zaakceptowana odpowiedź nie działała dla mnie i próbowałem połączyć ją z odpowiedzią związaną z tym setuptoolsi sprawić, że zadziałała.
Big_Al_Tx

github.com/pypa/pip/issues/5243 - Rozmowa zespołu programistów o usuniętym dostępie do get_installed_distributions routine.
bl79

@ bl79 - Myślę, że to jest dokładnie to miejsce, do którego mam referencje setuptools.
Big_Al_Tx

@Big_Al_Tx: Cóż, w pewnym sensie pracowałem nad opcją setuptools (którą można było zaciemnić dla moich potrzeb) i poszedłem z tym: install_pkgs = subprocess.check_output (['pip', 'freeze']) Robi dokładnie to, co ja musiałem to zrobić .... Tak !!
numer w czwartek

26

Jeśli musimy wyświetlić listę zainstalowanych pakietów w powłoce Pythona, możemy użyć helppolecenia w następujący sposób

>>help('modules package')

22

Zwykle używam pip list aby uzyskać listę pakietów (z wersją).

Oczywiście działa to również w środowisku wirtualnym. Aby pokazać, co jest zainstalowane tylko w środowisku wirtualnym (nie w pakietach globalnych), użyj pip list --local.

Oto dokumentacja pokazująca wszystkie dostępne pip listopcje, z kilkoma dobrymi przykładami.


13

Bardzo proste wyszukiwanie przy użyciu pkgutil.iter_modules

from pkgutil import iter_modules
a=iter_modules()
while True:
    try: x=a.next()
    except: break
    if 'searchstr' in x[1]: print x[1]

czy jest jakiś powód, aby używać while zamiast pętli for? Pisałem używając for m in iter_modules()i to też działało.
Joao Ponte

13

w systemie Windows wpisz to w cmd

c:\python\libs>python -m pip freeze

Działa to dla mnie przy użyciu: python3 -m pip freeze - dla python 3.5.3.
dpminusa,

Działa to dobrze i nie musisz znajdować się w katalogu libs, jeśli twoje zmienne są zdefiniowane
mcy

12

Wpadłem na niestandardowo zainstalowanego Pythona 2.7 w OS X. Wymagało X11, aby wyświetlić listę zainstalowanych modułów (zarówno za pomocą pomocy, jak i pydoc).

Aby móc wyświetlić listę wszystkich modułów bez instalowania X11, uruchomiłem pydoc jako serwer http, tj .:

pydoc -p 12345

Następnie można skierować Safari, http://localhost:12345/aby wyświetlić wszystkie moduły.



12

To pomoże

W terminalu lub IPython wpisz:

help('modules')

następnie

In [1]: import                      #import press-TAB
Display all 631 possibilities? (y or n)
ANSI                   audiodev               markupbase
AptUrl                 audioop                markupsafe
ArgImagePlugin         avahi                  marshal
BaseHTTPServer         axi                    math
Bastion                base64                 md5
BdfFontFile            bdb                    mhlib
BmpImagePlugin         binascii               mimetools
BufrStubImagePlugin    binhex                 mimetypes
CDDB                   bisect                 mimify
CDROM                  bonobo                 mmap
CGIHTTPServer          brlapi                 mmkeys
Canvas                 bsddb                  modulefinder
CommandNotFound        butterfly              multifile
ConfigParser           bz2                    multiprocessing
ContainerIO            cPickle                musicbrainz2
Cookie                 cProfile               mutagen
Crypto                 cStringIO              mutex
CurImagePlugin         cairo                  mx
DLFCN                  calendar               netrc
DcxImagePlugin         cdrom                  new
Dialog                 cgi                    nis
DiscID                 cgitb                  nntplib
DistUpgrade            checkbox               ntpath

To powinna być zaakceptowana odpowiedź! Jedna linia :)
AlmostPitt

9

To rozwiązanie jest oparte na modułach importlibi pkgutildziała z CPython 3.4 i CPython 3.5, ale nie obsługuje CPython 2.


Wyjaśnienie

  1. sys.builtin_module_names- nazywa wszystkie wbudowane moduły (spójrz na moją odpowiedź tutaj )
  2. pkgutil.iter_modules() - zwraca informację o wszystkich dostępnych modułach
  3. importlib.util.find_spec() - zwraca informację o module importu, jeśli istnieje
  4. BuiltinImporter- importer wbudowanych modułów ( dokumentów )
  5. SourceFileLoader- importer standardowego modułu Python (domyślnie ma rozszerzenie * .py) ( docs )
  6. ExtensionFileLoader- importer modułów jako biblioteka współdzielona (napisany w C lub C ++)

Pełny kod

import sys
import os
import shutil
import pkgutil
import importlib
import collections

if sys.version_info.major == 2:
    raise NotImplementedError('CPython 2 is not supported yet')


def main():

    # name this file (module)
    this_module_name = os.path.basename(__file__).rsplit('.')[0]

    # dict for loaders with their modules
    loaders = collections.OrderedDict()

    # names`s of build-in modules
    for module_name in sys.builtin_module_names:

        # find an information about a module by name
        module = importlib.util.find_spec(module_name)

        # add a key about a loader in the dict, if not exists yet
        if module.loader not in loaders:
            loaders[module.loader] = []

        # add a name and a location about imported module in the dict
        loaders[module.loader].append((module.name, module.origin))

    # all available non-build-in modules
    for module_name in pkgutil.iter_modules():

        # ignore this module
        if this_module_name == module_name[1]:
            continue

        # find an information about a module by name
        module = importlib.util.find_spec(module_name[1])

        # add a key about a loader in the dict, if not exists yet
        loader = type(module.loader)
        if loader not in loaders:
            loaders[loader] = []

        # add a name and a location about imported module in the dict
        loaders[loader].append((module.name, module.origin))

    # pretty print
    line = '-' * shutil.get_terminal_size().columns
    for loader, modules in loaders.items():
        print('{0}\n{1}: {2}\n{0}'.format(line, len(modules), loader))
        for module in modules:
            print('{0:30} | {1}'.format(module[0], module[1]))


if __name__ == '__main__':
    main()

Stosowanie

Dla CPython3.5 (obcięty)

$ python3.5 python_modules_info.py 
------------------------------------------------------------------------------------------------------------------------------------------------------------------------
30: <class '_frozen_importlib.BuiltinImporter'>
------------------------------------------------------------------------------------------------------------------------------------------------------------------------
_ast                           | built-in
_codecs                        | built-in
_collections                   | built-in
_functools                     | built-in
_imp                           | None
_io                            | built-in
_locale                        | built-in
_operator                      | built-in
_signal                        | built-in
_sre                           | built-in
_stat                          | built-in
_string                        | built-in
_symtable                      | built-in
_thread                        | built-in
(****************************truncated*******************************)
------------------------------------------------------------------------------------------------------------------------------------------------------------------------
227: <class '_frozen_importlib_external.SourceFileLoader'>
------------------------------------------------------------------------------------------------------------------------------------------------------------------------
__future__                     | /usr/local/lib/python3.5/__future__.py
_bootlocale                    | /usr/local/lib/python3.5/_bootlocale.py
_collections_abc               | /usr/local/lib/python3.5/_collections_abc.py
_compat_pickle                 | /usr/local/lib/python3.5/_compat_pickle.py
_compression                   | /usr/local/lib/python3.5/_compression.py
_dummy_thread                  | /usr/local/lib/python3.5/_dummy_thread.py
_markupbase                    | /usr/local/lib/python3.5/_markupbase.py
_osx_support                   | /usr/local/lib/python3.5/_osx_support.py
_pydecimal                     | /usr/local/lib/python3.5/_pydecimal.py
_pyio                          | /usr/local/lib/python3.5/_pyio.py
_sitebuiltins                  | /usr/local/lib/python3.5/_sitebuiltins.py
(****************************truncated*******************************)
------------------------------------------------------------------------------------------------------------------------------------------------------------------------
64: <class '_frozen_importlib_external.ExtensionFileLoader'>
------------------------------------------------------------------------------------------------------------------------------------------------------------------------
_bisect                        | /usr/local/lib/python3.5/lib-dynload/_bisect.cpython-35m-x86_64-linux-gnu.so
_bz2                           | /usr/local/lib/python3.5/lib-dynload/_bz2.cpython-35m-x86_64-linux-gnu.so
_codecs_cn                     | /usr/local/lib/python3.5/lib-dynload/_codecs_cn.cpython-35m-x86_64-linux-gnu.so
_codecs_hk                     | /usr/local/lib/python3.5/lib-dynload/_codecs_hk.cpython-35m-x86_64-linux-gnu.so
_codecs_iso2022                | /usr/local/lib/python3.5/lib-dynload/_codecs_iso2022.cpython-35m-x86_64-linux-gnu.so
(****************************truncated*******************************)

Dla CPython3.4 (obcięty)

$ python3.4 python_modules_info.py
------------------------------------------------------------------------------------------------------------------------------------------------------------------------
54: <class '_frozen_importlib.BuiltinImporter'>
------------------------------------------------------------------------------------------------------------------------------------------------------------------------
_ast                           | built-in
_bisect                        | built-in
_codecs                        | built-in
_collections                   | built-in
_datetime                      | built-in
_elementtree                   | built-in
_functools                     | built-in
_heapq                         | built-in
_imp                           | None
_io                            | built-in
_locale                        | built-in
_md5                           | built-in
_operator                      | built-in
_pickle                        | built-in
_posixsubprocess               | built-in
_random                        | built-in
(****************************truncated*******************************)
------------------------------------------------------------------------------------------------------------------------------------------------------------------------
246: <class '_frozen_importlib.SourceFileLoader'>
------------------------------------------------------------------------------------------------------------------------------------------------------------------------
__future__                     | /usr/lib/python3.4/__future__.py
_bootlocale                    | /usr/lib/python3.4/_bootlocale.py
_collections_abc               | /usr/lib/python3.4/_collections_abc.py
_compat_pickle                 | /usr/lib/python3.4/_compat_pickle.py
_dummy_thread                  | /usr/lib/python3.4/_dummy_thread.py
_markupbase                    | /usr/lib/python3.4/_markupbase.py
_osx_support                   | /usr/lib/python3.4/_osx_support.py
_pyio                          | /usr/lib/python3.4/_pyio.py
(****************************truncated*******************************)
------------------------------------------------------------------------------------------------------------------------------------------------------------------------
44: <class '_frozen_importlib.ExtensionFileLoader'>
------------------------------------------------------------------------------------------------------------------------------------------------------------------------
_bz2                           | /usr/lib/python3.4/lib-dynload/_bz2.cpython-34m-x86_64-linux-gnu.so
_codecs_cn                     | /usr/lib/python3.4/lib-dynload/_codecs_cn.cpython-34m-x86_64-linux-gnu.so
_codecs_hk                     | /usr/lib/python3.4/lib-dynload/_codecs_hk.cpython-34m-x86_64-linux-gnu.so
_codecs_iso2022                | /usr/lib/python3.4/lib-dynload/_codecs_iso2022.cpython-34m-x86_64-linux-gnu.so
_codecs_jp                     | /usr/lib/python3.4/lib-dynload/_codecs_jp.cpython-34m-x86_64-linux-gnu.so
_codecs_kr                     | /usr/lib/python3.4/lib-dynload/_codecs_kr.cpython-34m-x86_64-linux-gnu.so
_codecs_tw                     | /usr/lib/python3.4/lib-dynload/_codecs_tw.cpython-34m-x86_64-linux-gnu.so
_crypt                         | /usr/lib/python3.4/lib-dynload/_crypt.cpython-34m-x86_64-linux-gnu.so
(****************************truncated*******************************)

Czy możesz porównać swoje podejście do podejścia Adama tutaj stackoverflow.com/a/23885252/54964
Léo Léopold Hertz 준영

@ Léo Léopold Hertz, dlaczego go potrzebujesz?
PADYMKO

Zrozumienie, w jaki sposób twoje podejście jest lepsze / gorsze niż podejście Adama.
Léo Léopold Hertz 준영

1
@ Léo Léopold Hertz. Krótka odpowiedź: spróbuj sam w produkcji i sam wyciągnij wnioski. Długa odpowiedź: podejście Adama opiera się na pip- systemie zarządzania pakietami używanym do instalowania i zarządzania pakietami oprogramowania napisanymi w Pythonie, a wynik pip.get_installed_distributions()zwraca moduły zainstalowane z pipem. Moja odpowiedź w całości oparta jest na standardowej bibliotece Pythona i obejmuje wszystkie moduły dostępne do importu. Największa wada mojej odpowiedzi - brak wsparcia dla CPython 2.
PADYMKO

1
@ Léo Léopold Hertz się mylisz, robi to. Przetestowałem to na moim komputerze. Moja odpowiedź ma specjalne znaczenie **truncated**, gdy dane wyjściowe są obcinane. Może nie jesteś ostrożny, ale jeśli tak nie jest, więc aby przesłać mi informacje o twoim systemie i implementacji Pythona, przeprowadzę dodatkowe badania, aby to naprawić.
PADYMKO

9

Ostrzeżenie: Adam Matan odradza takie użycie w pip> 10,0. Przeczytaj także komentarz @ sinoroc poniżej

To był inspirowany przez Adam Matan za odpowiedź (przyjętą jeden):

import tabulate
try:
  from pip import get_installed_distributions
except:
  from pip._internal.utils.misc import get_installed_distributions

tabpackages = []
for _, package in sorted([('%s %s' % (i.location, i.key), i) for i in get_installed_distributions()]):
  tabpackages.append([package.location, package.key, package.version])

print(tabulate.tabulate(tabpackages))

który następnie drukuje tabelę w postaci

19:33 pi@rpi-v3 [iot-wifi-2] ~/python$ python installed_packages.py
-------------------------------------------  --------------  ------
/home/pi/.local/lib/python2.7/site-packages  enum-compat     0.0.2
/home/pi/.local/lib/python2.7/site-packages  enum34          1.1.6
/home/pi/.local/lib/python2.7/site-packages  pexpect         4.2.1
/home/pi/.local/lib/python2.7/site-packages  ptyprocess      0.5.2
/home/pi/.local/lib/python2.7/site-packages  pygatt          3.2.0
/home/pi/.local/lib/python2.7/site-packages  pyserial        3.4
/usr/local/lib/python2.7/dist-packages       bluepy          1.1.1
/usr/local/lib/python2.7/dist-packages       click           6.7
/usr/local/lib/python2.7/dist-packages       click-datetime  0.2
/usr/local/lib/python2.7/dist-packages       construct       2.8.21
/usr/local/lib/python2.7/dist-packages       pyaudio         0.2.11
/usr/local/lib/python2.7/dist-packages       tabulate        0.8.2
-------------------------------------------  --------------  ------

co pozwala łatwo rozpoznać, które pakiety zostały zainstalowane zi bez sudo.


Uwaga na bok: zauważyłem, że kiedy instaluję pakiet raz za pośrednictwem sudoi raz bez niego, jeden ma pierwszeństwo, aby drugiego nie było na liście (wyświetlana jest tylko jedna lokalizacja). Uważam, że na liście znajduje się tylko ten z katalogu lokalnego. Można to poprawić.


1
Nie. Nie jest to zalecane, patrz tutaj: pip.pypa.io/en/stable/user_guide/#using-pip-from-your-program
sinoroc

1
@sinoroc Dziękujemy za zwrócenie na to uwagi. Punkty 1–3 wydają się nie mieć zastosowania do tego rozwiązania, ponieważ ten skrypt ma na celu wyłącznie pipjednorazowe użycie, a następnie zamknięcie. Wygląda na to, że zachowanie może zmienić problem.
Daniel F,

Uzgodnione powody, dla których nie ma publicznego interfejsu API, nie dotyczą tego konkretnego fragmentu kodu. Ale ponieważ pip nie jest zobowiązany do zagwarantowania publicznego interfejsu API, może swobodnie zmieniać swoje wewnętrzne interfejsy API, strukturę kodu itp. W późniejszym wydaniu, jak to już miało miejsce wcześniej. Dlatego ten kod ma try / wyjątkiem, aby złapać poprzednią reorganizację kodu wewnętrznego, która miała wyjaśnić, że wewnętrzne interfejsy API są wewnętrznymi interfejsami API, a nie publicznymi ( _internal). W sumie to oczywiście działa, ale jest złą praktyką. Istnieją lepsze alternatywy, niektóre znajdują się w innych odpowiedziach na to pytanie.
sinoroc,

1
ten skrypt nie zadziała, jeśli nie będzie tam modułu „pip”.
Alexander Stohr


6

Jeśli masz zainstalowaną dystrybucję python anakonda , możesz również użyć

$conda list

oprócz rozwiązań opisanych powyżej.


Gdzie / jak uruchamiasz tę linię?
HuckIt

Jeśli korzystasz z komputera z systemem UNIX / Mac OS X, otwórz terminal i po prostu wpisz conda install, powinien działać :)
Shreyas

Jestem na komputerze z systemem Windows 7. Znalazłem go na mojej ścieżce, ale plik conda.exe znajduje się w AppData \ Local \ Continuum \ Anaconda \ Scripts.
HuckIt

6
  1. aby uzyskać wszystkie dostępne moduły, uruchom sys.modules
  2. aby uzyskać wszystkie zainstalowane moduły (czytaj: zainstalowane przez pip), możesz spojrzeć napip.get_installed_distributions()

W drugim celu przykładowy kod:

import pip
for package in pip.get_installed_distributions():
    name = package.project_name # SQLAlchemy, Django, Flask-OAuthlib
    key = package.key # sqlalchemy, django, flask-oauthlib
    module_name = package._get_metadata("top_level.txt") # sqlalchemy, django, flask_oauthlib
    location = package.location # virtualenv lib directory etc.
    version = package.version # version number

Polecenie sys.modules nie działa w Pythonie najnowszego OSX. NameError: nazwa „system” nie jest zdefiniowana .
Léo Léopold Hertz

@Masi Czy miałeś na myśli /usr/bin/pythonczy ten pochodzi z python.org ? W przypadku tego pierwszego mogę używać sys.modulesbez problemu.
yegle

Mam na myśli / usr / bin / python .
Léo Léopold Hertz 준영

@Masi Nie jestem pewien, czy nadal jesteś zainteresowany tym problemem. Najwyraźniej używasz system.moduleszamiast sys.modules.
yegle

Lol. Mój błąd polegał na tym, że pierwotnie nie importowałem pakietu sys. Zamiast tego uruchom zamiast tego zaimportuj sys; sys.modules działa zgodnie z oczekiwaniami.
Léo Léopold Hertz

6

Dla najnowszej wersji, takiej jak Pip 20

Uruchom następujące polecenie w edytorze Python lub IPython

import pkg_resources; 
installed_packages = {d.project_name: d.version for d in pkg_resources.working_set}
print(installed_packages)

Przeczytaj inne odpowiedzi i zbierz razem to połączenie, które jest najszybsze i najłatwiejsze w Pythonie


4

pip freeze robi wszystko, szukając pakietów, jednak można po prostu napisać następującą komendę, aby wyświetlić listę wszystkich ścieżek, w których znajdują się pakiety Pythona.

>>> import site; site.getsitepackages()
['/usr/local/lib/python2.7/dist-packages', '/usr/lib/python2.7/dist-packages']

4

Istnieje wiele sposobów na skórowanie kota.

  • Najprostszym sposobem jest użycie pydocfunkcji bezpośrednio z powłoki za pomocą:
    pydoc modules

  • Aby uzyskać więcej informacji, skorzystaj z narzędzia o nazwie pip-date, które również poda daty instalacji.
    pip install pip-date


wprowadź opis zdjęcia tutaj


3

Istnieje wiele pomysłów, początkowo zastanawiam się nad tymi dwoma:

pypeć

Wady: nie zawsze instalowane

pomoc („moduły”)

Minusy: wyjście do konsoli; z uszkodzonymi modułami (patrz ubuntu ...) może segfault

Potrzebuję łatwego podejścia, używając podstawowych bibliotek i kompatybilnych ze starym Pythonem 2.x.

I widzę światło: listmodules.py

W katalogu źródłowym dokumentacji w wersji 2.5 ukryty jest mały skrypt, który wyświetla listę wszystkich dostępnych modułów do instalacji Pythona.

Plusy:

używa tylko imp, sys, os, re, time

zaprojektowany do działania w Pythonie 1.5.2 i nowszych

kod źródłowy jest naprawdę kompaktowy, więc możesz łatwo z nim majstrować, na przykład, aby przekazać listę wyjątków błędnych modułów (nie próbuj ich importować)


3

Musiałem znaleźć konkretną wersję pakietów dostępnych domyślnie w AWS Lambda. Zrobiłem to z mieszanką pomysłów z tej strony. Udostępniam to dla potomności.

import pkgutil

__version__ = '0.1.1'

def get_ver(name):
    try:
        return str(__import__(name).__version__)
    except:
        return None

def lambda_handler(event, context):
    return {
        'statusCode': 200,
        'body': [{
                   'path': m.module_finder.path,
                   'name': m.name,
                   'version': get_ver(m.name),
                 } for m in list(pkgutil.iter_modules())
                 #if m.module_finder.path == "/var/runtime" # Uncomment this if you only care about a certain path
                ],
    }

Odkryłem, że dostarczona biblioteka boto3 była bardzo nieaktualna i to nie moja wina, że ​​mój kod zawiódł. Po prostu potrzebowałem dodać boto3 i botocore do mojego projektu. Ale bez tego waliłbym się w głowę, sądząc, że mój kod jest zły.

{
  "statusCode": 200,
  "body": [
    {
      "path": "/var/task",
      "name": "lambda_function",
      "version": "0.1.1"
    },
    {
      "path": "/var/runtime",
      "name": "bootstrap",
      "version": null
    },
    {
      "path": "/var/runtime",
      "name": "boto3",
      "version": "1.9.42"
    },
    {
      "path": "/var/runtime",
      "name": "botocore",
      "version": "1.12.42"
    },
    {
      "path": "/var/runtime",
      "name": "dateutil",
      "version": "2.7.5"
    },
    {
      "path": "/var/runtime",
      "name": "docutils",
      "version": "0.14"
    },
    {
      "path": "/var/runtime",
      "name": "jmespath",
      "version": "0.9.3"
    },
    {
      "path": "/var/runtime",
      "name": "lambda_runtime_client",
      "version": null
    },
    {
      "path": "/var/runtime",
      "name": "lambda_runtime_exception",
      "version": null
    },
    {
      "path": "/var/runtime",
      "name": "lambda_runtime_marshaller",
      "version": null
    },
    {
      "path": "/var/runtime",
      "name": "s3transfer",
      "version": "0.1.13"
    },
    {
      "path": "/var/runtime",
      "name": "six",
      "version": "1.11.0"
    },
    {
      "path": "/var/runtime",
      "name": "test_bootstrap",
      "version": null
    },
    {
      "path": "/var/runtime",
      "name": "test_lambda_runtime_client",
      "version": null
    },
    {
      "path": "/var/runtime",
      "name": "test_lambda_runtime_marshaller",
      "version": null
    },
    {
      "path": "/var/runtime",
      "name": "urllib3",
      "version": "1.24.1"
    },
    {
      "path": "/var/lang/lib/python3.7",
      "name": "__future__",
      "version": null
    },
...

To, co odkryłem, różniło się również od tego, co oficjalnie publikują . W momencie pisania tego:

  • System operacyjny - Amazon Linux
  • AMI - amzn-ami-hvm-2017.03.1.20170812-x86_64-gp2
  • Jądro Linux - 4.14.77-70.59.amzn1.x86_64
  • AWS SDK dla JavaScript - 2.290.0 \
  • SDK dla Python (Boto 3) - 3-1.7.74 botocore-1.10.74

1

Instalacja

pip install pkgutil

Kod

import pkgutil

for i in pkgutil.iter_modules(None): # returns a tuple (path, package_name, ispkg_flag)
    print(i[1]) #or you can append it to a list

Przykładowe dane wyjściowe:

multiprocessing
netrc
nntplib
ntpath
nturl2path
numbers
opcode
pickle
pickletools
pipes
pkgutil

1

Oto rozwiązanie kodu python, które zwróci listę zainstalowanych modułów. Można łatwo zmodyfikować kod, aby zawierał numery wersji.

import subprocess
import sys
from pprint import pprint

installed_packages = reqs = subprocess.check_output([sys.executable, '-m', 'pip', 'freeze']).decode('utf-8')
installed_packages = installed_packages.split('\r\n')
installed_packages = [pkg.split('==')[0] for pkg in installed_packages if pkg != '']
pprint(installed_packages)


-10

Z muszli

ls site-packages

Jeśli to nie pomoże, możesz to zrobić.

import sys
import os
for p in sys.path:
    print os.listdir( p )

I zobacz, co to produkuje.


który katalog pakietów witryn? Może to zrobić lepiej: ls / usr / {local /,} lib / python $ (python -V 2> & 1 | cut -d "" -f2 | cut -d. -F1-2) / site-packages
vezult

Nie będzie to również wyświetlać wbudowanych modułów ani modułów w niestandardowym PYTHONPATH, ani modułów zainstalowanych w „trybie programowania” setuptools itp.
dF.

Mój /usr/local/lib/python2.5/site-packages jest pusty, chociaż mam zainstalowane moduły.
Léo Léopold Hertz 준영

14
Wyrazy uznania za nieusunięcie tej zaniżonej odpowiedzi. Społeczność pomaga zrozumieć, dlaczego często uważa się, że odpowiedź jest błędna.
Jeremy Stein

1
@JeremyStein Lepszą strategią (bardziej pomocną i prawdopodobnie mniej szkodliwą dla powtórzeń) byłaby prawdopodobnie edycja pytania, aby wyjaśnić, dlaczego jest źle, gdy zostanie to wyjaśnione w komentarzach ...
Kyle Strand
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.