Eu preciso saber se existe um módulo python, sem importá-lo.
Importando algo que pode não existir (não o que eu quero):
try:
import eggs
except ImportError:
pass
python
python-import
yarbelk
fonte
fonte
Respostas:
Python2
Para verificar se a importação pode encontrar algo no python2, use
imp
Para encontrar importações pontilhadas, você precisa fazer mais:
Você também pode usar
pkgutil.find_loader
(mais ou menos o mesmo que a parte python3Python3
Python3 ≤ 3.3
Você deve usar
importlib
, como eu fiz isso foi:Minha expectativa é que, se você puder encontrar um carregador para ele, ele existe. Você também pode ser um pouco mais inteligente, como filtrar quais carregadores você aceitará. Por exemplo:
Python3 ≥ 3,4
No Python3.4, os
importlib.find_loader
documentos python foram preteridos em favor deimportlib.util.find_spec
. O método recomendado é oimportlib.util.find_spec
. Existem outros comoimportlib.machinery.FileFinder
, o que é útil se você estiver atrás de um arquivo específico para carregar. Descobrir como usá-los está além do escopo disso.Isso também funciona com importações relativas, mas você deve fornecer o pacote inicial, para que você também possa:
Embora tenha certeza de que existe uma razão para fazer isso - não tenho certeza do que seria.
AVISO
Ao tentar encontrar um submódulo, ele importará o módulo pai (para todos os métodos acima)!
comentários bem-vindos em contornar este
Reconhecimentos
find_loader
fonte
eggs.ham.spam
.spam
emeggs.ham
você usariaimp.find_module('spam', ['eggs', 'ham'])
imp
é preterido em favor deimportlib
em Python 3.pkgutil.find_loader("my.package.module")
retorna um carregador se o pacote / módulo existir eNone
se não existir . Atualize sua resposta para o Python 2, pois mascarar o ImportError me deixou louco ontem xPDepois de usar a resposta do yarbelk, fiz isso para não precisar importar
ìmp
.Útil no Django,
settings.py
por exemplo.fonte
Python 3> = 3.6: ModuleNotFoundError
O
ModuleNotFoundError
foi introduzido no python 3.6 e pode ser usado para essa finalidadeO erro ocorre quando um módulo ou um de seus pais não pode ser encontrado. assim
imprimiria uma mensagem parecida com
No module named 'eggs'
aeggs
módulo não pode ser encontrado; mas imprimiria algo comoNo module named 'eggs.sub'
se apenas osub
módulo não pudesse ser encontrado, mas oeggs
pacote pudesse ser encontrado.Consulte a documentação do sistema de importação para obter mais informações sobre o
ModuleNotFoundError
fonte
Python 2, sem confiar no ImportError
Até que a resposta atual seja atualizada, aqui está o caminho para o Python 2
Por que outra resposta?
Muitas respostas fazem uso de pegar um
ImportError
. O problema disso é que não podemos saber o que lança oImportError
.Se você importar seu módulo existente e houver um
ImportError
no seu módulo (por exemplo, erro de digitação na linha 1), o resultado será que seu módulo não existe. Você precisará de uma grande quantidade de retorno para descobrir que o seu módulo existe eImportError
é capturado e faz com que as coisas falhem silenciosamente.fonte
ImportError
- edite se não estiver claro para você.A resposta de go_as como um forro
fonte
Me deparei com essa pergunta enquanto procurava uma maneira de verificar se um módulo está carregado na linha de comando e gostaria de compartilhar meus pensamentos para os que vieram depois de mim e procurando o mesmo:
Método de arquivo de script Linux / UNIX : make a file
module_help.py
:Em seguida, verifique se é executável:
chmod u+x module_help.py
E chame-o com a
pipe
paragrep
:Método interativo : na carga do console
python
Se encontrado, saia da leitura digitando
q
Para sair da sessão interativa python, pressione Ctrl+D
O método de arquivo de script do Windows também é compatível com Linux / UNIX e , em geral , melhor :
Chamando a partir do comando, como:
Saída:
e você teria que pressionar
q
para sair do modo interativo.Usando-o módulo desconhecido:
Saída:
e saia.
fonte
Use uma das funções do pkgutil , por exemplo:
fonte
Uma declaração if mais simples do AskUbuntu: Como verifico se um módulo está instalado no Python?
fonte
Você pode escrever um pequeno script que tentará importar todos os módulos e informar quais estão falhando e quais estão funcionando:
Resultado:
Aviso: isso tentará importar tudo, assim você verá coisas como
PyYAML failed with error code: No module named pyyaml
porque o nome da importação real é apenas yaml. Portanto, desde que você conheça suas importações, isso deve fazer o truque para você.fonte
Eu escrevi esta função auxiliar:
fonte
Você também pode usar
importlib
diretamentefonte
Não há como verificar com segurança se o "módulo pontilhado" é importável sem importar o pacote pai. Dizendo isso, existem muitas soluções para o problema "como verificar se o módulo Python existe".
A solução abaixo aborda o problema que o módulo importado pode gerar ImportError mesmo que ele exista. Queremos distinguir essa situação daquela em que módulo não existe.
Python 2 :
Python 3 :
fonte
no django.utils.module_loading.module_has_submodule
fonte