Pergunta

Gostaria de obter uma lista de módulos Python, que são na minha instalação do Python (servidor UNIX).

Como você pode obter uma lista de Python módulos instalados em seu computador?

Foi útil?

Solução

Solução

Não use com pip> 10,0!

Os meus 50 centavos para a obtenção de um pip freeze-like lista a partir de um script 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)

Como um (muito) um forro:

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

Dar:

['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']

Scope

Esta solução aplica-se ao âmbito do sistema ou a um escopo ambiente virtual, e pacotes de coberturas instalado por setuptools, pip e ( Deus me livre ) easy_install.

Meu caso de uso

Eu adicionei o resultado dessa chamada para o meu servidor frasco, então quando eu chamá-lo com http://example.com/exampleServer/environment I obter a lista de pacotes instalados no virtualenv do servidor. Ele torna a depuração muito mais fácil.

Advertências

Tenho notado um comportamento estranho desta técnica -. Quando o interpretador Python é invocado no mesmo diretório como um arquivo setup.py, ele não lista o pacote instalado por setup.py

Passos para reproduzir:

Criar um ambiente virtual
$ 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 uma git repo com 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.

Temos setup.py de se comportar de /tmp/behave:

(test_env) $ ls /tmp/behave/setup.py
/tmp/behave/setup.py
Instale o pacote python a partir do repo 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

Se executar a solução acima mencionada de /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'

Se executar a solução acima mencionada de /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 está faltando a partir do segundo exemplo, porque o diretório de trabalho contém arquivo behave de setup.py.

Eu não poderia encontrar qualquer referência a esta questão na documentação. Talvez eu abra um bug para ele.

Outras dicas

help('modules')

num shell Python / alerta.

Agora, esses métodos me tentado, e I got exatamente o que foi anunciado: Todos os módulos

.

Infelizmente, realmente você não se importa muito sobre a stdlib, você sabe o que você começa com uma python instalar.

Realmente, eu quero as coisas que I instalado.

O que realmente, surpreendentemente, funcionou muito bem foi:

pip freeze

Qual devolvidos:

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

Digo "surpreendentemente" porque o pacote de instalação da ferramenta é o lugar um exata esperaria encontrar essa funcionalidade, embora não sob o nome de 'congelar' mas a embalagem python é tão estranho, que eu estou espantado que esta ferramenta faz sentido. Pip 0.8.2, 2.7 Python.

  • Na ipython você pode digitar "import Tab ".

  • No interpretador Python padrão, você pode digitar "help('modules')".

  • Na linha de comando, você pode usar pydoc modules.

  • Em um script, chamada pkgutil.iter_modules() .

Desde pip versão 1.3, você tem acesso a:

pip list

O que parece ser um açúcar sintático para "congelar pip". Ele irá listar todos os módulos específicos para sua instalação ou virtualenv, juntamente com os seus números de versão. Infelizmente ele não exibir o número da versão atual de qualquer módulo, nem lavar seus pratos ou brilhar os seus sapatos.

Eu só uso isso para ver módulos atualmente utilizados:

import sys as s
s.modules.keys()

que mostra todos os módulos em execução no seu python.

Para todos os built-in módulos usar:

s.modules

O que é um dicionário que contém todos os módulos e objetos de importação.

No shell normal usar apenas

pydoc modules

A partir de pip 10, a resposta aceita não funcionará mais. A equipe de desenvolvimento tem acesso removido para a rotina get_installed_distributions. Há uma função alternativa na setuptools para fazer a mesma coisa. Aqui está uma versão alternativa que funciona com 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)

Por favor, deixe-me saber se ele vai ou não vai funcionar nas versões anteriores do pip também.

Se for necessário listar os pacotes instalados no shell Python, podemos usar o comando help como segue

>>help('modules package')

Eu normalmente uso pip list para obter uma lista de pacotes (com a versão).

Isso funciona em um ambiente virtual também, é claro. Para mostrar o que está instalado apenas no ambiente virtual (não pacotes globais), o uso pip list --local.

Aqui está a documentação mostrando todas as opções pip list disponíveis, com vários bons exemplos .

pesquisando muito simples usando 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]

Eu corri para um personalizado instalado Python 2.7 no Mac OS X. É necessário X11 para módulos lista instalada (ambos usando ajuda e pydoc).

Para ser capaz de listar todos os módulos sem instalar X11 Corri pydoc como http-servidor, ou seja:.

pydoc -p 12345

Em seguida, é possível direcionar o Safari para http://localhost:12345/ para ver todos os módulos.

no Windows, Enter isso em cmd

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

Isto foi inspirado por resposta de Adam Matan (aquele aceitas):

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

que, em seguida, imprime uma tabela na forma de

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

que permite então facilmente discernir quais pacotes você instalou com e sem sudo.


Uma nota de lado: Tenho notado que quando eu instalar um pacote uma vez via sudo e uma vez sem, um tem precedência para que o outro não está sendo listado (apenas um local é mostrado). Acredito que somente um no diretório local é então listada. Esta poderia ser melhorado.

Além de usar pip freeze I têm vindo a instalar gema em meus ambientes virtuais.

  1. para obter todos os módulos disponíveis, execute sys.modules
  2. para obter todas instalar módulos (leia-se: instalado por pip), você pode olhar para pip.get_installed_distributions()

Para o segundo objetivo, exemplo de código:

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

Esta solução é primário com base em módulos importlib e pkgutil e trabalho com CPython 3,4 e 3,5 CPython, mas não tem apoio para a CPython 2.


Explicação

  1. sys.builtin_module_names - nomes de todos os built-in módulos (olhar a minha resposta aqui )
  2. pkgutil.iter_modules() - retorna uma informação sobre todos os módulos disponíveis
  3. importlib.util.find_spec() - retorna uma informação sobre a importação do módulo, se existe
  4. BuiltinImporter - um importador para built-in módulos ( docs )
  5. SourceFileLoader - um importador para um módulo padrão do Python (por padrão tem extensão * .py) ( docs )
  6. ExtensionFileLoader - um importador para módulos como compartilhada biblioteca ( escrito em C ou C ++)

código completo

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

Uso

Para o CPython3.5 (truncado)

$ 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*******************************)

Para o CPython3.4 (truncado)

$ 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*******************************)

No caso de você ter um href="https://store.continuum.io/cshop/anaconda/" rel="noreferrer"> anaconda distribuição instalado, você também pode usar

$conda list

Além das soluções acima descrito.

congelamento pip faz isso todos os pacotes achado no entanto pode-se simplesmente escrever o seguinte comando para listar todos os caminhos onde os pacotes Python são.

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

Existem muitas idéias, inicialmente eu estou pensando sobre estes dois:

pip

contras: nem sempre instalado

Ajuda ( 'módulos')

contras: saída para o console; com módulos quebrados (veja ubuntu ...) pode segfault

Eu preciso de uma abordagem fácil, usando bibliotecas básicas e compatível com python velho 2.x

E eu ver a luz: listmodules.py

Escondido no diretório fonte da documentação em 2,5 é um pequeno script que lista todos os módulos disponíveis para a instalação do Python.

Pros:

usa apenas imp, sys, os, re, tempo

projetado para rodar em Python 1.5.2 e mais recente

o código-fonte é realmente compacto, para que possa fácil mexer com ele, por exemplo, para passar uma lista de exceção de módulos de buggy (não tente importá-los)

Existem muitas maneira de esfolar um gato.

  • A maneira mais simples é usar a função pydoc diretamente do shell com:
    pydoc modules

  • Mas há mais uso da informação a ferramenta chamada pip-date que também dizer você as datas de instalação.
    pip install pip-date


enter descrição da imagem aqui

Tente estas

pip list

ou

pip freeze

Eu precisava encontrar a versão específica de pacotes disponíveis por padrão no AWS Lambda. Eu fiz isso com um mashup de idéias desta página. Eu estou compartilhando-o para a posteridade.

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
                ],
    }

O que eu descobri é que a biblioteca boto3 fornecido era maneira fora da data e não era minha culpa que meu código estava falhando. Eu só precisava para adicionar boto3 e botocore ao meu projeto. Mas, sem isso eu teria sido batendo a cabeça pensando meu código era ruim.

{
  "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
    },
...

O que eu descobri também era diferente o que eles publicar oficialmente . No momento da escrita deste:

  • Sistema operacional - Amazon Linux
  • AMI - AMZN-ami-HVM-2017.03.1.20170812-x86_64-GP2
  • kernel do Linux - 4.14.77-70.59.amzn1.x86_64
  • AWS SDK para JavaScript - 2.290.0 \
  • SDK para Python (Boto 3) - 3-1.7.74 botocore-1.10.74

Para quem se perguntando como chamar pip list de um programa Python você pode usar o seguinte:

import pip
pip.main(['list])  # this will print all the packages

Isso vai ajudar

No terminal ou IPython, digite:

help('modules')

então

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

A partir do shell

ls site-packages

Se isso não é útil, você pode fazer isso.

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

E ver o que produz.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top