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?

Foi útil?

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).

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top