Jak Mogę uzyskać listę lokalnie zainstalowanych modułów Pythona?

Chciałbym otrzymać listę modułów Pythona, które znajdują się w mojej instalacji Pythona (serwer UNIX).

Jak można uzyskać listę modułów Pythona zainstalowanych w komputerze?

Author: nbro, 2009-04-11

20 answers

Rozwiązanie

Moje 50 centów za zdobycie pip freeze - jak lista ze skryptu Pythona:

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 (zbyt długa) jedna linijka:

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

Dając:

['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 dotyczy zakresu systemowego lub zakresu środowiska wirtualnego i obejmuje pakiety zainstalowane przez setuptools, pip i (broń Boże) easy_install.

Mój przypadek użycia

Dodałem wynik tego wywołania do mojego serwera flask, więc gdy wywołam go z http://example.com/exampleServer/environment otrzymuję lista pakietów zainstalowanych na serwerze virtualenv. To znacznie ułatwia debugowanie.

Caveats

Zauważyłem dziwne zachowanie tej techniki - gdy interpreter Pythona jest wywoływany w tym samym katalogu co plik setup.py, nie wyświetla on listy pakietów zainstalowanych przez setup.py.

Kroki do odtworzenia:

Tworzenie środowiska wirtualnego
$ cd /tmp
$ virtualenv test_env
New python executable in test_env/bin/python
Installing setuptools, pip...done.
$ source test_env/bin/activate
(test_env) $ 
Clone a Git repo with 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.

Mamy setup.py w /tmp/behave:

(test_env) $ ls /tmp/behave/setup.py
/tmp/behave/setup.py
Zainstaluj pakiet Pythona z git repo
(test_env) $ cd /tmp/behave && python setup.py 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 wspomniane 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 wspomniane 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.5a1 brak w drugim przykładzie, ponieważ katalog roboczy zawiera plik behave setup.py.

Nie mogłem znaleźć żadnego odniesienia do tego problemu w dokumentacji. Może otworzę na to pluskwę.

 497
Author: Adam Matan,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 10:31:38
help('modules')

W powłoce Pythona / prompt.

 823
Author: ChristopheD,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-04-11 12:45:45

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

Niestety, naprawdę nie dbasz zbytnio o stdlib, wiesz co dostajesz z instalacją Pythona.

Naprawdę, chcę rzeczy, które i zainstalowany.

To, co właściwie, o dziwo, działało dobrze, to: {]}
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 instalacji pakietu jest dokładnie tym miejscem, w którym można by się tego spodziewać funkcjonalność, chociaż nie pod nazwą "freeze", ale opakowanie Pythona jest tak dziwne, że jestem oszołomiony, że to narzędzie ma sens. Pip 0.8.2, Python 2.7.

 228
Author: chiggsy,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-01-16 04:01:18
  • W ipython możesz wpisać "importTab ".

  • W standardowym interpreterze Pythona można wpisać " help('modules')".

  • W wierszu poleceń można użyć pydoc modules.

  • W skrypcie zadzwoń pkgutil.iter_modules().

 72
Author: Johnsyweb,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-02-08 13:30:04

Od wersji pip 1.3 masz dostęp do:

pip list

Który wydaje się być składniowym cukrem dla "PIP freeze". Wyświetli wszystkie moduły specyficzne dla instalacji lub virtualenv, wraz z ich numerami wersji. Niestety nie wyświetla aktualnego numeru wersji żadnego modułu, nie myje naczyń ani nie czyści butów.

 65
Author: Bryce,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-07-25 23:30:57

Używam tylko 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.

Dla wszystkich wbudowanych modułów użyj:

s.modules

Który jest dict zawierającym wszystkie moduły i Obiekty importu.

 54
Author: Dan Evans,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-01-13 10:43:55

W zwykłej powłoce wystarczy użyć

pydoc modules
 53
Author: DrkNess,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-08-23 09:45:31

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

>>help('modules package')
 19
Author: Sadheesh,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-04-25 19:42:48

Natknąłem się na niestandardowy zainstalowany python 2.7 na OS X. wymagało to X11, aby wyświetlić listę zainstalowanych modułów (zarówno za pomocą help, jak i pydoc).

Aby móc wypisać wszystkie moduły bez instalowania X11 uruchomiłem pydoc jako serwer http, czyli:

pydoc -p 12345

Następnie można przekierować Safari do http://localhost:12345/, aby zobaczyć wszystkie moduły.

 11
Author: Qiau,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-08-24 10:28:05

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]
 10
Author: stuudent,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-05-12 12:34:44

W systemie windows wpisz to w cmd

c:\python\libs>python -m pip freeze
 9
Author: Saurabh,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-12-11 14:54:51

Od pip 10, zaakceptowana odpowiedź nie będzie już działać. Zespół programistów usunął dostęp do procedury get_installed_distributions. Istnieje alternatywna Funkcja setuptools do robienia tego samego. Oto alternatywna wersja, która działa z pip 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)

Proszę dać mi znać, czy to będzie działać lub nie w poprzednich wersjach pip, zbyt.

 9
Author: Big_Al_Tx,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-04-25 02:58:49

Poza używaniem pip freeze instalowałem yolk w moich wirtualnych środowiskach.

 7
Author: jdsantiagojr,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-12-02 20:56:07
  1. Aby pobrać wszystkie dostępne moduły, uruchom sys.modules
  2. aby uzyskać wszystkie zainstalowane Moduły (Czytaj: zainstalowane przez pip), możesz spojrzeć na pip.get_installed_distributions()

Dla drugiego 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
 6
Author: yegle,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-01-21 06:42:12

To rozwiązanie bazuje na modułach importlib i pkgutil i działa z CPython 3.4 i CPython 3.5, ale nie ma wsparcia dla 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 importowaniu modułu, jeśli istnieje
  4. BuiltinImporter - importer modułów wbudowanych (docs )
  5. SourceFileLoader - importer standardowego modułu Pythona (domyślnie posiada rozszerzenie *.py) (docs)
  6. W przeciwieństwie do innych modułów, nie można ich używać do tworzenia własnych bibliotek.]}

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()

Użycie

Dla CPython3 .5 (okrojony)

$ 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 (okrojony)

$ 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*******************************)
 6
Author: Seti Volkylany,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 12:34:47

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

$conda list

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

 3
Author: Shreyas,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-12-05 23:38:03

PIP freeze robi to wszystko znajdując Pakiety jednak można po prostu napisać następujące polecenie, 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']
 3
Author: Pavan Gupta,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-04-21 10:52:02

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

Oczywiście działa to również w środowisku wirtualnym.
 3
Author: James,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-09-08 21:32:26

Pomysłów jest wiele, początkowo zastanawiam się nad tymi dwoma:

Pip

Wady: nie zawsze zainstalowany

Help ('Moduły')

Wady: wyjście na konsolę; z uszkodzonymi modułami (patrz ubuntu...) can segfault

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

I widzę światło: listmodules.py

Ukryty w katalogu źródłowym dokumentacji w 2.5 jest mały skrypt zawierający listę wszystkich dostępnych modułów dla instalacji Pythona.

Plusy:

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

Zaprojektowany do pracy w Pythonie 1.5.2 i nowszych

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

 0
Author: Massimo,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-09-19 09:06:22

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 da.
 -9
Author: S.Lott,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-04-11 18:38:27