适用于虚线模块的`imp.find_module`版本

时间:2011-04-26 19:41:20

标签: python import

imp.find_module现有实现是否适用于虚线模块名称?它不需要是防弹的,如果它在某些情况下不起作用也没关系。但它起作用的案例越多越好。

请不要尝试在答案中实现此功能。我已经实现了我的版本,我问是否有现有的实现,因为如果有的话,它可能比我的版本测试得多。

5 个答案:

答案 0 :(得分:5)

importlib可能就是你所追求的。特别是函数import_moduledocs说:

  

importlib.import_module(name, package=None)

     

导入模块。 name 参数指定要以绝对或相对术语导入的模块(例如pkg.mod..mod)。如果名称是以相对术语指定的,则参数必须设置为包的名称,该包用作解析包名称的锚点(例如import_module('..mod', 'pkg.subpkg')将导入pkg.mod

答案 1 :(得分:1)

对于观看此问题并寻找方法的其他人,这就是我正在使用的内容。

import imp

def find_dotted_module(name, path=None):
    res = None
    for x in name.split('.'):
        res = imp.find_module(x, path)
        path = [module[1]]
    return res

答案 2 :(得分:1)

def find_dotted_module(name, path=None):
    '''
    Example: find_dotted_module('mypackage.myfile')

    Background: imp.find_module() does not handle hierarchical module names (names containing dots).

    Important: No code of the module gets executed. The module does not get loaded (on purpose)
    ImportError gets raised if the module can't be found.

    Use case: Test discovery without loading (otherwise coverage does not see the lines which are executed 
              at import time)
    '''

    for x in name.split('.'):
        if path is not None:
            path=[path]
        file, path, descr = imp.find_module(x, path)
    return path

答案 3 :(得分:0)

我假设您在imp.find_module的文档中尝试了以下内容?

  

此功能无法处理   分层模块名称(名称   含点)。为了找到   P. M ,即包的子模块M.   P,使用find_module()和load_module()   找到并加载包P,然后   将find_module()与路径一起使用   参数设置为P .__ path__。当P   本身有一个虚线名称,适用于此   食谱递归。

答案 4 :(得分:0)

好吧,如果您知道自己在做什么,并且认为imp检查太复杂了,怎么办?

        if not all([x.isalnum() or x == '.' for x in name]):
            raise ValueError('invalid module name')
        exec("import %s" % name)