Pregunta

Me gustaría obtener una lista de los módulos de Python que se encuentran en mi instalación de Python (servidor UNIX).

¿Cómo puede obtener una lista de los módulos de Python instalados en su computadora?

¿Fue útil?

Solución

Solución

No utilizar con pip> 10,0!

Mis 50 centavos para obtener una lista pip freeze similar a partir de una secuencia de comandos de 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 (demasiado largo) un trazador de líneas:

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

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

Alcance

Esta solución se aplica al ámbito de aplicación del sistema o a un ámbito entorno virtual, y cubre los paquetes instalados por setuptools, pip y ( Dios no lo quiera ) easy_install.

Mi caso de uso

He añadido el resultado de esta llamada a mi servidor frasco, por lo que cuando la llamo con http://example.com/exampleServer/environment consigo la lista de paquetes instalados en virtualenv del servidor. Esto hace que la depuración sea mucho más fácil.

Advertencias

he notado un comportamiento extraño de esta técnica - cuando el intérprete de Python se invoca en el mismo directorio que un archivo setup.py, que no muestra el paquete instalado por setup.py

.

Pasos para reproducir:

Crear un entorno 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) $ 
Clonar un repositorio git con 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.

Tenemos setup.py de comportarse de /tmp/behave:

(test_env) $ ls /tmp/behave/setup.py
/tmp/behave/setup.py
Instalar el paquete python desde el repositorio 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

Si se corre la solución antes 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'

Si se corre la solución antes 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 no se encuentra en el segundo ejemplo, debido a que el directorio de trabajo contiene el archivo de behave setup.py.

No pude encontrar ninguna referencia a este tema en la documentación. Tal vez voy a abrir un error para él.

Otros consejos

help('modules')

en una cáscara de Python / símbolo.

Ahora, estos métodos me trataron a mí mismo, y me dieron exactamente lo que anuncian: Todos los módulos

.

Por desgracia, realmente no se preocupan mucho sobre el stdlib, ustedes saben lo que obtienes con una pitón instalar.

En serio, quiero las cosas que I instalado.

Lo que en realidad, es sorprendente que funcionaba bien era:

pip freeze

Lo que regresó:

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

Yo digo "sorprendentemente" porque la herramienta el paquete de instalación es el lugar exacto que uno esperaría encontrar esta funcionalidad, aunque no bajo el nombre de 'congelar' pero el envase Python es tan raro, que estoy asombrada de que esta herramienta tiene sentido. Pip 0.8.2, Python 2.7.

Desde la versión 1.3 de pepita, tienes acceso a:

pip list

Lo que parece ser el azúcar sintáctica para "congelar pip". Se mostrará una lista de todos los módulos particulares para su instalación o virtualenv, junto con sus números de versión. Por desgracia, no se muestra el número de versión actual de cualquier módulo, ni lavar los platos o brillar sus zapatos.

sólo tiene que utilizar esto para ver los módulos utilizados en la actualidad:

import sys as s
s.modules.keys()

que muestra todos los módulos se ejecutan en el pitón.

Para todos los módulos incorporados en uso:

s.modules

¿Qué es un diccionario que contiene todos los módulos y objetos de importación.

En shell normales sólo tiene que utilizar

pydoc modules

A partir del PIP 10, la respuesta aceptada ya no funcionará. El equipo de desarrollo ha eliminado el acceso a la rutina get_installed_distributions. Hay una función alternativa en el setuptools para hacer la misma cosa. Aquí es una versión alternativa que funciona con 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, hágamelo saber si va o no va a funcionar en las versiones anteriores de pip, también.

Si necesitamos una lista de los paquetes instalados en el terminal de Python, podemos utilizar el comando help de la siguiente manera

>>help('modules package')

Yo normalmente utilizo pip list para obtener una lista de paquetes (con la versión).

Esto funciona en un entorno virtual también, por supuesto. Para mostrar lo que está instalado sólo en el entorno virtual (no paquetes globales), utilice pip list --local.

Aquí hay documentación mostrando todas las opciones disponibles pip list, con varios buenos ejemplos .

búsqueda muy simple 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]

Me encontré con una pitón instalado encargo 2.7 en OS X. Se requiere X11 a la lista módulos instalados (tanto el uso de ayuda y pydoc).

Para poder listar todos los módulos sin necesidad de instalar X11 me encontré pydoc como http-servidor, es decir:.

pydoc -p 12345

A continuación, es posible dirigir a Safari http://localhost:12345/ para ver todos los módulos.

en Windows, escriba esto en cmd

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

Esto fue inspirada por responder (la aceptada uno):

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 luego imprime una mesa en 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 le permite entonces discernir fácilmente qué paquetes que haya instalado con y sin sudo.


Una nota aparte: me he dado cuenta de que cuando instalo un paquete una vez a través de sudo y otra sin él, uno tiene prioridad para que el otro no está en la lista (sólo se muestra una ubicación). Creo que sólo el uno en el directorio local aparece a continuación. Esto podría mejorarse.

Aparte de usar pip freeze he estado instalando yema en mis entornos virtuales.

  1. para obtener todos los módulos disponibles, ejecute sys.modules
  2. para obtener todos los instalado módulos (es decir: instalado por pip), es posible mirar a pip.get_installed_distributions()

Para el segundo objetivo, el código de ejemplo:

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 solución es primaria basada en módulos. importlib y pkgutil y funciona con CPython 3.4 y CPython 3.5, pero no es compatible con CPython 2.


Explicación

  1. sys.builtin_module_names - nombra todos los módulos integrados (mira mi respuesta aquí)
  2. pkgutil.iter_modules() - devuelve información sobre todos los módulos disponibles
  3. importlib.util.find_spec() - devuelve información sobre la importación del módulo, si existe
  4. BuiltinImporter - un importador de módulos integrados (documentos)
  5. SourceFileLoader - un importador para un módulo estándar de Python (por defecto tiene la extensión *.py) (documentos)
  6. ExtensionFileLoader - un importador de módulos como biblioteca compartida (escrito en C o 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 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 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*******************************)

En caso de tener una anaconda pitón distribución instalado, también se puede utilizar

$conda list

Además de las soluciones descritas anteriormente.

congelación pip lo hace todos los paquetes hallazgo sin embargo, uno puede simplemente escriba el siguiente comando para listar todos los caminos donde los paquetes de Python son.

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

Hay muchas ideas, inicialmente Estoy barajando en estos dos:

pip

  

contras: no siempre se instala

ayuda ( 'módulos')

  

contras: la salida a la consola; con módulos rotos (ver ubuntu ...) pueden segfault

Necesito un enfoque sencillo, utilizando librerías básicas y compatible con el viejo Python 2.x

Y veo la luz: listmodules.py

Oculto en el directorio de fuentes de documentación en 2,5 es un pequeño script que enumera todos los módulos disponibles para una instalación de Python.

Pros:

  

sólo utiliza imp, sys, os, re, el tiempo

     

diseñado para funcionar en Python 1.5.2 y posteriores

     

el código fuente es muy compacta, por lo que fácilmente puede juguetear con él, por ejemplo, para pasar a una lista de excepciones de módulos con errores (no trate de importarlos)

Hay muchas maneras de pelar un gato.

  • La forma más simple es utilizar la función de pydoc directamente de la cáscara con:
    pydoc modules

  • Sin embargo, para más información utilice la herramienta llamada pip actualizados que también dirá que las fechas de instalación.
    pip install pip-date


introducir descripción de la imagen aquí

Trate de éstos

pip list

o

pip freeze

Necesitaba encontrar la versión específica de los paquetes disponibles por defecto en AWS Lambda. Lo hice con un mashup de las ideas de esta página. Estoy compartiendo para la posteridad.

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

Lo que descubrí es que la biblioteca boto3 siempre estaba fuera de fecha y que no era mi culpa que mi código estaba fallando. Sólo tenía que añadir boto3 y botocore a mi proyecto. Pero sin que esto habría estado golpeando mi cabeza pensando en mi código era mala.

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

Lo que descubrí fue también diferente de lo que publicar oficialmente . En el momento de escribir esto:

  
      
  • Sistema operativo - Amazon Linux
  •   
  • AMI - AMZN-ami-HVM-2017.03.1.20170812-x86_64-GP2
  •   
  • núcleo de 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-01.10.74
  •   

Para cualquier persona preguntándose cómo llamar pip list de un programa de Python se puede utilizar lo siguiente:

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

Esto ayudará

En terminal o IPython, tipo:

help('modules')

entonces

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

Desde el shell

ls site-packages

Si eso no es útil, se puede hacer esto.

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

y ver lo que produce.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top