2016-02-26 78 views
0

我需要帮助,以获得不导入模块的名称,而这样做获取已导入失败

这样的代码是当前模块的名称:

#!/usr/bin/env python 
bla=[] 
try: 
    import os 
    import sys 
    import somethings 
    import blabla 
except: 
    bla.append(NOT_IMPORTED_MODULE_NAME) # it should be here 
if len(bla)>0: 
    exit("not imported:%s" % " ".join(bla)) 

谢谢你提前

+0

您的代码将在第一次失败的导入时停止。你的堆栈跟踪会告诉你哪个模块会失败。如果你真的想,你可以解析出字符串来获取模块名称。但是,这可能是一个更好的方法为你:http://stackoverflow.com/questions/14050281/how-to-check-if-a-python-module-exists-without-importing-it – idjaw

+0

@idjaw所以有没有办法做到这一点? – script0r

+0

我还没有找到一个理由来做到这一点,所以我从来没有真正分析过这一点。我发布的链接看起来像我想做的事情。请记住,如果引发异常,您的代码将停止运行,因此现在编写代码的方式会失败,并且不会报告blabla。 – idjaw

回答

2

尽管我要说的更适合作为评论,但我只是在这里打字,因为我因为低信誉度而不被允许评论。 (因为我在这里很新)

假设你有sys和blabla模块丢失。使用当前设置,它会在尝试加载sys时引发异常。它甚至不会达到import blabla。所以你不知道如果模块丢失或者没有以前的模块丢失。如果你真的想要你想要的功能,你可以将所有模块导入的每一个import module都包含在异常处理中。但在我看来,这已经结束了。正如idjaw提到的,如果有任何模块丢失,您应该能够从堆栈跟踪中看到。

0
#!/usr/bin/env python 
import sys 
import os 
from importlib import import_module 

bla = [] 

for modulename in ('something', 'blabla'): 
    try: 
     import_module(modulename) 
    except ImportError as exc: 
     bla.append(str(exc)) 


if bla: 
    sys.stderr.write('\n'.join(bla)) 
    sys.stderr.write('\n') 
    sys.exit(1)