Como forçar um importador na máquina de desenvolvimento? (módulo PWD)
-
20-09-2019 - |
Pergunta
Estou tentando usar um Lib (Docutils) de terceiros no Google App Engine e ter um problema com este código (em Docutils):
try:
import pwd
do stuff
except ImportError:
do other stuff
Quero que a importação falhe, como será no servidor GAE real, mas o problema é que ele não falha na minha caixa de desenvolvimento (Ubuntu). Como fazê -lo falhar, já que a importação não está no meu próprio código?
Solução
Ainda mais fácil do que mexer com __import__
é apenas inserindo None
Nos sys.modules dit:
>>> import sys
>>> sys.modules['pwd'] = None
>>> import pwd
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
ImportError: No module named pwd
Outras dicas
Na sua estrutura de teste, antes de fazer com que os Docutils sejam importados, você pode executar esta tarefa de configuração:
import __builtin__
self.savimport = __builtin__.__import__
def myimport(name, *a):
if name=='pwd': raise ImportError
return self.savimport(name, *a)
__builtin__.__import__ = myimport
E, claro, na desmontagem, colocou as coisas de volta ao normal:
__builtin__.__import__ = self.savimport
Explicação: Todas as operações de importação passam __builtin__.__import__
, e você pode reatribuir esse nome para que essas operações usem seu próprio código (alternativas como ganchos de importação são melhores para fins como realizar a importação de fontes que não sejam do Filessistema, mas para fins como o seu, superando __builtin__.__import__
, como você vê acima, oferece código verdadeiramente simples).