¿Cómo puedo obtener una lista de módulos Python instalados localmente?
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?
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.
-
ipython href="http://ipython.org/"> puede escribir "
import
Tab ". -
En el intérprete de Python estándar, puede escribir "
help('modules')
". -
En la línea de comandos, puede utilizar
pydoc
modules
. -
En un script, llamado
pkgutil.iter_modules()
.
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.
- para obtener todos los módulos disponibles, ejecute
sys.modules
- para obtener todos los instalado módulos (es decir: instalado por
pip
), es posible mirar apip.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
sys.builtin_module_names
- nombra todos los módulos integrados (mira mi respuesta aquí)pkgutil.iter_modules()
- devuelve información sobre todos los módulos disponiblesimportlib.util.find_spec()
- devuelve información sobre la importación del módulo, si existeBuiltinImporter
- un importador de módulos integrados (documentos)SourceFileLoader
- un importador para un módulo estándar de Python (por defecto tiene la extensión *.py) (documentos)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
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.