Como posso obter uma lista de módulos Python instalados localmente?
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?
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.
- para obter todos os módulos disponíveis, execute
sys.modules
- para obter todas instalar módulos (leia-se: instalado por
pip
), você pode olhar parapip.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
-
sys.builtin_module_names
- nomes de todos os built-in módulos (olhar a minha resposta aqui ) -
pkgutil.iter_modules()
- retorna uma informação sobre todos os módulos disponíveis -
importlib.util.find_spec()
- retorna uma informação sobre a importação do módulo, se existe -
BuiltinImporter
- um importador para built-in módulos ( docs ) -
SourceFileLoader
- um importador para um módulo padrão do Python (por padrão tem extensão * .py) ( docs ) -
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
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.