Como posso verificar se importei um módulo em algum lugar do código?
if not has_imported("somemodule"):
print('you have not imported somemodule')
Gostaria de verificar se já importei um módulo porque tenho um módulo que não quero importar porque às vezes bagunça meu programa.
python
python-import
Yuval
fonte
fonte
raise SystemError()
(ou outra exceção de sua escolha) no topo do módulo que você não deseja importar. Se você não realmente importá-lo em algum lugar, seu programa irá lançar um rastreamento e sair.Respostas:
Teste o nome do módulo no
sys.modules
dicionário :import sys modulename = 'datetime' if modulename not in sys.modules: print 'You have not imported the {} module'.format(modulename)
Da documentação:
Observe que uma
import
declaração faz duas coisas:sys.modules
), ele é carregado e adicionadosys.modules
.A expressão
modulename not in sys.modules
testa se a etapa 1 ocorreu. O teste para o resultado da etapa 2 requer saber qualimport
instrução exata foi usada, pois eles definem nomes diferentes para fazer referência a objetos diferentes:import modulename
conjuntosmodulename = sys.modules['modulename']
import packagename.nestedmodule
conjuntospackagename = sys.modules['packagename']
(não importa quantos níveis adicionais você adicionar)import modulename as altname
conjuntosaltname = sys.module['modulename']
import packagename.nestedmodule as altname
conjuntosaltname = sys.modules['packagename.nestedmodule']
from somemodule import objectname
conjuntosobjectname = sys.modules['somemodule'].objectname
from packagename import nestedmodulename
conjuntosnestedmodulename = sys.modules['packagename.nestedmodulename']
(somente quando não havia nenhum objeto nomeadonestedmodulename
nopackagename
namespace antes desta importação, um nome adicional para o módulo aninhado é adicionado ao namespace do pacote pai neste ponto)from somemodule import objectname as altname
conjuntosaltname = sys.modules['somemodule'].objectname
from packagename import nestedmodulename as altname
conjuntosaltname = sys.modules['packagename.nestedmodulename']
(somente quando não havia nenhum objeto nomeadonestedmodulename
nopackagename
namespace antes desta importação, um nome adicional para o módulo aninhado é adicionado ao namespace do pacote pai neste ponto)Você pode testar se o nome ao qual o objeto importado foi associado existe em um determinado namespace:
# is this name visible in the current scope: 'importedname' in dir() # or, is this a name in the globals of the current module: 'importedname' in globals() # or, does the name exist in the namespace of another module: 'importedname' in globals(sys.modules['somemodule'])
Isso apenas informa se o nome existe (foi vinculado), não se ele se refere a um módulo ou objeto específico desse módulo. Você pode examinar mais profundamente esse objeto ou testar se é o mesmo objeto que está disponível
sys.modules
, se precisar descartar que o nome foi definido como algo totalmente diferente desde então.fonte
numpy
pacote - usarimport sys
dentro da função é o melhor para verificar se ela foi importada? Por "melhor", quero dizer, em termos de impacto no desempenho, comoimport sys
será então chamado cada vez que a função for chamada. Obrigadoimport sys
seja de forma alguma caro;sys
sempre existe, por padrão já está carregado. Mas para um pacote opcional: basta importar o pacote . Capture aImportError
exceção se o pacote não estiver instalado e defina um sinalizador indicando que ele está instalado quando a importação for bem-sucedida. Depois disso, você pode usar o sinalizador para informar seu uso da dependência opcional.name in sys.modules
teste só é útil se você não quiser importar .Para as respostas sys.modules aceitas, eu adicionaria uma advertência para ter cuidado ao renomear os módulos na importação:
>>> import sys >>> import datetime as dt >>> 'dt' in sys.modules False >>> 'datetime' in sys.modules True
fonte
use sys.modules para testar se um módulo foi importado (estou usando unicodedata como exemplo):
>>> import sys >>> 'unicodedata' in sys.modules False >>> import unicodedata >>> 'unicodedata' in sys.modules True
fonte
sys.modules
contém todos os módulos usados em qualquer lugar na instância atual do interpretador e, portanto, é exibido se importado em qualquer outro módulo Python.dir()
verifica se o nome foi definido no namespace atual.A combinação dos 2 é mais segura do que cada um separadamente e funciona desde que você não tenha definido um
copy
.if ('copy' in sys.modules) and ('copy' in dir()):
fonte
if "sys" not in dir(): print("sys not imported!")
fonte
sys
pode ser qualquer coisa, não apenas um módulo.