Existe uma maneira direta de listar os nomes de todos os módulos em um pacote, sem usar __all__
?
Por exemplo, dado este pacote:
/testpkg
/testpkg/__init__.py
/testpkg/modulea.py
/testpkg/moduleb.py
Estou me perguntando se existe uma maneira padrão ou integrada de fazer algo assim:
>>> package_contents("testpkg")
['modulea', 'moduleb']
A abordagem manual seria iterar pelos caminhos de pesquisa do módulo para encontrar o diretório do pacote. Pode-se então listar todos os arquivos nesse diretório, filtrar os arquivos py / pyc / pyo nomeados exclusivamente, remover as extensões e retornar essa lista. Mas isso parece uma quantidade razoável de trabalho para algo que o mecanismo de importação de módulo já está fazendo internamente. Essa funcionalidade está exposta em algum lugar?
imp.get_suffixes()
vez de sua lista escrita à mão.xml.sax
Usando python2.3 e superior , você também pode usar o
pkgutil
módulo:EDITAR: Observe que o parâmetro não é uma lista de módulos, mas uma lista de caminhos, então você pode querer fazer algo assim:
fonte
pkgutil
está lá em python2.3 e superior, na verdade . Além disso, emborapkgutil.iter_modules()
não funcione recursivamente, existe umpkgutil.walk_packages()
também, que irá recursivamente. Obrigado pela indicação para este pacote.iter_modules
que não funciona para importação absoluta comoa.b.testpkg
? Ele está me dando[]
pkgutil.walk_packages()
recorrente, ele me dá a mesma saída quepkgutil.iter_modules()
, então acho que a resposta está incompleta.fonte
help()
imprime coisas, não retorna uma string.help()
funciona. De qualquer forma, o built-inpydoc
módulo pode ajudar a cuspir o string quehelp()
Pagina:import pydoc; pydoc.render_doc('mypackage')
.Não sei se estou negligenciando algo, ou se as respostas estão apenas desatualizadas, mas;Conforme declarado pelo usuário815423426, isso só funciona para objetos ativos e os módulos listados são apenas módulos que foram importados antes.
Listar módulos em um pacote parece muito fácil usando inspect :
fonte
imported = import importlib; importlib.import_module('myproj.mymod.mysubmod')
.__import__
importa o módulo de nível superior, consulte a documentação .import inspect, mypackage
e entãoinspect.getmembers(my_package, inspect.ismodule)
recebo uma lista vazia, embora eu certamente tenha vários módulos nela.import my_package.foo
e não apenasimport mypackage
, caso em que, então, ele retornafoo
. Mas isso derrota o propósitoEsta é uma versão recursiva que funciona com o python 3.6 e superior:
fonte
os.scandir
como um gerenciador de contexto em vez de iterar as entradas de resultado diretamente?close
seja chamado quando você terminar de usá- lo para garantir que todos os recursos mantidos sejam liberados.re
vez disso, ele lista todos os pacotes, mas adicionare.
a todos elesCom base no exemplo de cdleary, aqui está um caminho de listagem de versão recursiva para todos os submódulos:
fonte
Isso deve listar os módulos:
fonte
Se você gostaria de ver uma informação sobre o seu pacote fora do código Python (de um prompt de comando), você pode usar o pydoc para isso.
Você terá o mesmo resultado que pydoc, mas dentro do interpretador usando a ajuda
fonte
fonte
logging
pacote do Python para ver o que quero dizer. O registro contém dois módulos: manipuladores e configuração. Seu código retornará uma lista de 66 itens, que não inclui esses dois nomes.imprimir dir (módulo)
fonte