Como posso obter uma lista de Módulos Python instalados localmente?
gostaria de obter uma lista de Módulos Python, que estão na minha instalação Python (servidor UNIX).
Como pode obter uma lista de Módulos Python instalados no seu computador?20 answers
Solução
Os meus 50 cêntimos por conseguir uma lista como a de uma 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 uma linha (demasiado longa):
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']
Âmbito de aplicação
Esta solução aplica-se ao âmbito do sistema ou a um âmbito de ambiente virtual, e abrange pacotes instalados por setuptools
, pip
e Deus me livre) easy_install
.
A minha mala de uso
Adicionei o resultado desta chamada ao meu servidor de garrafas, por isso, quando a chamo comhttp://example.com/exampleServer/environment
obtenha a lista de pacotes instalados no virtualenv do servidor. Torna a depuração muito mais fácil.
Advertências
Notei um comportamento estranho desta técnica-quando o interpretador de Python é invocado no mesmo directório que um ficheiro setup.py
, ele não lista o pacote instalado por setup.py
.
Passos para a reprodução:
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) $
Clonar um acordo 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 comportamo-nos /tmp/behave
:
(test_env) $ ls /tmp/behave/setup.py
/tmp/behave/setup.py
Instalar o pacote python do repo 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 analisarmos 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 analisarmos 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á em falta no segundo exemplo, porque a pasta de trabalho contém o ficheiro behave
'S setup.py
.
help('modules')
Numa linha de comandos em Python.
Realmente, eu quero o material que instalado.
O que, surpreendentemente, funcionou muito bem foi:pip freeze
Que voltou:
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 este funcionalidade, embora não sob o nome 'freeze', mas Embalagem python é tão estranho, que eu estou flabbergasted que esta ferramenta faz sentido. Pip 0.8.2, Python 2.7.
Em
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
.Num guião, chama
pkgutil.iter_modules()
.
Desde a versão 1.3 do pip, tens acesso a:
pip list
O que parece ser açúcar sintático para"pip freeze". Ele listará todos os módulos particulares para sua instalação ou virtualenv, juntamente com seus números de versão. Infelizmente, ele não mostra o número de versão atual de qualquer módulo, nem lava seus pratos ou engraxa seus sapatos.
Só uso isto para ver os módulos actualmente utilizados:
import sys as s
s.modules.keys()
Que mostra todos os módulos em execução na sua python.
Para todos os módulos incorporados, utilizar:
s.modules
Que é um dict que contém todos os módulos e objectos de importação.
Com uma concha normal, basta usar
pydoc modules
Se precisarmos de listar os pacotes instalados na shell Python, podemos usar o comando help
como se segue
>>help('modules package')
Encontrei um python 2.7 personalizado instalado no OS X. Foi necessário que o X11 listasse os módulos instalados (tanto com a ajuda como com o pydoc).
Para ser capaz de listar todos os módulos sem instalar o X11, executei o pydoc como Servidor http, ou seja:
pydoc -p 12345
Então é possível direcionar Safari para http://localhost:12345/
para ver todos os módulos.
Procura muito simples usando o pkgutil.iter_módulos
from pkgutil import iter_modules
a=iter_modules()
while True:
try: x=a.next()
except: break
if 'searchstr' in x[1]: print x[1]
Nas janelas, digite isto em cmd
c:\python\libs>python -m pip freeze
A partir do pip 10, a resposta aceite deixará de funcionar. A equipa de desenvolvimento removeu o acesso à rotina get_installed_distributions
. Há uma função alternativa no 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, avise-me se irá ou não funcionar em versões anteriores do pip, também.
Além de usar {[[0]} tenho estado a instalar yolk nos meus ambientes virtuais.
- para obter todos os módulos disponíveis, execute
sys.modules
- para obter todos os instalados (Leia: instalados por
pip
), pode olhar parapip.get_installed_distributions()
Para a segunda finalidade, código de exemplo:
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ária baseada nos Módulos importlib
e pkgutil
e trabalha com o CPython 3.4 e o CPython 3.5, mas não tem suporte para o CPython 2.
Anotações
-
sys.builtin_module_names
- nomeia todos os módulos incorporados (veja a minha resposta aqui) -
pkgutil.iter_modules()
- devolve uma informação sobre todos os módulos disponíveis -
importlib.util.find_spec()
- devolve uma informação sobre a importação do módulo, se existir -
BuiltinImporter
- um importador de módulos incorporados ([29]}docs) -
SourceFileLoader
- um importador para um módulo Python padrão (por omissão tem a extensão *. py) (docs) -
ExtensionFileLoader
- um importador de módulos como Biblioteca partilhada (escrita 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()
Utilização
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 ter uma distribuiçãode anaconda python instalada, Poderá também usar
$conda list
Além das soluções acima descritas.
O Pip freeze faz com que tudo encontre pacotes, no entanto, pode-se simplesmente escrever o seguinte comando para listar todos os locais onde os pacotes python estão.
>>> import site; site.getsitepackages()
['/usr/local/lib/python2.7/dist-packages', '/usr/lib/python2.7/dist-packages']
Normalmente uso pip list
para obter uma lista de pacotes (com a versão).
Há muitas ideias, inicialmente estou a ponderar sobre estas duas:
Pip
Cons: nem sempre instalado
Ajuda ('módulos')
Cons: saída para consola; com módulos quebrados (ver ubuntu...) can segfault
Preciso de uma abordagem fácil, usando bibliotecas básicas e compatíveis com o python 2 antigo.x
E eu vejo a luz: listmodules.py
Escondido na pasta de origem da documentação em 2.5 é um pequeno script que lista todos os módulos disponíveis para uma instalação em Python.
Prós:
Usa apenas imp, sys, os, re, time
Desenhado para correr no Python 1.5.2 e mais recente
O código-fonte é realmente compacto, por isso pode ser fácil alterá-lo, por exemplo para passar uma lista de excepções de módulos buggy (não tente importá-los)
Da concha
ls site-packages
Se isso não ajudar, podes fazer isto.
import sys
import os
for p in sys.path:
print os.listdir( p )
E vê o que isso produz.