Existe uma maneira direta de encontrar todos os módulos que fazem parte de um pacote python? Eu encontrei essa discussão antiga , que não é realmente conclusiva, mas adoraria ter uma resposta definitiva antes de lançar minha própria solução com base em os.listdir ().
python
module
packages
introspection
python-import
static_rtti
fonte
fonte
Respostas:
Sim, você quer algo baseado em
pkgutil
ou semelhante - desta forma, você pode tratar todos os pacotes da mesma forma, independentemente se eles estão em ovos ou zips ou algo assim (onde os.listdir não ajudará).Como importá-los também? Você pode usar
__import__
normalmente:fonte
importer
retornadopkgutil.iter_modules
? Posso usá-lo para importar um módulo em vez de usar este "hack" aparentemente__import__(modname, fromlist="dummy")
?m = importer.find_module(modname).load_module(modname)
e entãom
é o módulo, por exemplo:m.myfunc()
_path_
). Deve haver dois de cada lado, para um total de quatro (ou seja__path__
).A ferramenta certa para esse trabalho é pkgutil.walk_packages.
Para listar todos os módulos em seu sistema:
Esteja ciente de que walk_packages importa todos os subpacotes, mas não os submódulos.
Se você deseja listar todos os submódulos de um determinado pacote, você pode usar algo assim:
iter_modules lista apenas os módulos que têm um nível de profundidade. walk_packages obtém todos os submódulos. No caso de scipy, por exemplo, walk_packages retorna
enquanto iter_modules só retorna
A documentação do pkgutil ( http://docs.python.org/library/pkgutil.html ) não lista todas as funções interessantes definidas em /usr/lib/python2.6/pkgutil.py.
Talvez isso signifique que as funções não fazem parte da interface "pública" e estão sujeitas a alterações.
No entanto, pelo menos a partir do Python 2.6 (e talvez nas versões anteriores?), O pkgutil vem com um método walk_packages que percorre recursivamente todos os módulos disponíveis.
fonte
walk_packages
agora está na documentação: docs.python.org/library/pkgutil.html#pkgutil.walk_packages_
) antes e depoispath
- ou seja, use empackage.__path__
vez depackage._path_
. Pode ser mais fácil tentar cortar e colar o código em vez de redigitá-lo.package
está apontando para um pacote, não um módulo. Módulos são arquivos enquanto pacotes são diretórios. Todos os pacotes têm o__path__
atributo (... a menos que alguémIsso funciona para mim:
fonte
Eu estava procurando uma maneira de recarregar todos os submódulos que estou editando ao vivo em meu pacote. É uma combinação das respostas / comentários acima, então decidi postar aqui como uma resposta ao invés de um comentário.
fonte
Aqui está uma maneira, de início:
Certamente poderia ser limpo e melhorado.
EDIT: Aqui está uma versão um pouco melhor:
NOTA: Isso também encontrará módulos que podem não estar necessariamente localizados em um subdiretório do pacote, se eles forem puxados em seu
__init__.py
arquivo, portanto, depende do que você entende por "parte de" um pacote.fonte