bibliotecas - conceito de módulo na linguagem de programação python




Como posso obter uma lista de módulos Python instalados localmente? (15)

Solução

Meus 50 centavos para obter uma lista parecida com o pip freeze 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 longo) um forro:

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

Dando:

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

Escopo

Essa solução se aplica ao escopo do sistema ou a um escopo do ambiente virtual e abrange pacotes instalados por setuptools , pip e ( easy_install ) easy_install .

Meu caso de uso

Eu adicionei o resultado desta chamada ao meu servidor de frascos, então quando eu chamo com http://example.com/exampleServer/environment eu recebo a lista de pacotes instalados no virtualenv do servidor. Isso torna a depuração muito mais fácil.

Ressalvas

Eu notei um comportamento estranho desta técnica - quando o interpretador Python é invocado no mesmo diretório que um arquivo setup.py , ele não lista o pacote instalado pelo setup.py .

Passos para reproduzir:

Crie 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 um repositório git 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.

Nós nos comportamos com o setup.py em /tmp/behave :

(test_env) $ ls /tmp/behave/setup.py
/tmp/behave/setup.py
Instale o pacote python do repositório git
(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

Se nós executarmos a solução mencionada acima em /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 executarmos a solução mencionada acima em /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 no segundo exemplo, porque o diretório de trabalho contém o arquivo setup.py .

Não consegui encontrar nenhuma referência a esse problema na documentação. Talvez eu deva abrir um bug para isso.

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

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


Se você estiver usando o Python 3

Eu apenas tentei no Ubuntu, e parece ter funcionado

Debian / Ubuntu: sudo apt-get install python3-matplotlib

Fedora: sudo dnf install python3-matplotlib

Red Hat: sudo yum install python3-matplotlib

Arco: sudo pacman -S python-matplotlib

Fonte: https://matplotlib.org/users/installing.html


A partir do pip 10, a resposta aceita não funcionará mais. A equipe de desenvolvimento removeu o acesso à rotina get_installed_distributions . Existe uma função alternativa nas setuptools para fazer a mesma coisa. Aqui está uma versão alternativa que funciona com o 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 vai ou não funcionar em versões anteriores do pip, também.


Agora, esses métodos eu tentei, e consegui exatamente o que foi anunciado: Todos os módulos.

Infelizmente, você não se importa muito com o stdlib, você sabe o que você obtém com uma instalação do Python.

Realmente, eu quero as coisas que eu instalei.

O que, surpreendentemente, funcionou bem foi:

pip freeze

Que retornou:

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

Eu digo "surpreendentemente" porque a ferramenta de instalação de pacotes é o lugar exato que se esperaria encontrar essa funcionalidade, embora não sob o nome "congelar", mas o empacotamento em python é tão estranho, que estou espantado que essa ferramenta faça sentido. Pip 0.8.2, Python 2.7.



Da casca

ls site-packages

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

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

E veja o que isso produz.


Esta solução é primária baseada nos módulos importlib e pkgutil e funciona com o CPython 3.4 e o CPython 3.5, mas não tem suporte para o CPython 2.

Explicação

  1. sys.builtin_module_names - nomeia todos os módulos sys.builtin_module_names (veja minha resposta here )
  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 o módulo de importação, se existir
  4. BuiltinImporter - um importador para módulos BuiltinImporter ( docs )
  5. SourceFileLoader - um importador para um módulo Python padrão (por padrão tem extensão * .py) ( docs )
  6. ExtensionFileLoader - um importador para módulos como biblioteca compartilhada (escrita no 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*******************************)

Eu corri para um python 2.7 customizado instalado no OS X. Ele exigia que o X11 listasse os módulos instalados (ambos usando help e pydoc).

Para poder listar todos os módulos sem instalar o X11, executei pydoc como http-server, ou seja:

pydoc -p 12345

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


Eu só uso isso para ver os módulos usados ​​atualmente:

import sys as s
s.modules.keys()

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

Para todos os módulos internos, use:

s.modules

Qual é um dict contendo todos os módulos e importando objetos.


Há muitas idéias, inicialmente eu estou pensando nesses dois:

pip

contras: nem sempre instalado

ajuda ('módulos')

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

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

E vejo a luz: listmodules.py

Oculto no diretório de origem da documentação em 2.5 está um pequeno script que lista todos os módulos disponíveis para uma instalação do Python.

Prós:

usa apenas imp, sys, os, re, time

projetado para rodar em Python 1.5.2 e mais recente

o código fonte é realmente compacto, então você pode facilmente mexer nele, por exemplo, para passar uma lista de exceção de módulos com bugs (não tente importá-los)


Na concha normal é só usar

pydoc modules

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

no windows, digite isso no cmd

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

O pip freeze faz todos os pacotes encontrarem no entanto é possível simplesmente escrever o seguinte comando para listar todos os caminhos onde estão os pacotes python.

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

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

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

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

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





pip