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

Python 适用于虚线模块的'imp.find_module'版本,python,import,Python,Import,是否有一个适用于虚线模块名的现有实现?它不需要防弹,如果在某些情况下不起作用也没关系。但它适用的案例越多越好 请不要试图在回答中实现这个功能。我已经实现了我的版本,我询问是否有现有的实现,因为如果有,它可能比我的版本测试得多。我假设您已经从imp.find_module的文档中尝试了以下内容 此函数不处理 分层模块名称(名称 包含点)。为了找到 P.M,即包的子模块M P、 使用find_module()和load_module() 查找并加载包P,然后 在路径中使用find_module()

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


请不要试图在回答中实现这个功能。我已经实现了我的版本,我询问是否有现有的实现,因为如果有,它可能比我的版本测试得多。

我假设您已经从
imp.find_module
的文档中尝试了以下内容

此函数不处理 分层模块名称(名称 包含点)。为了找到 P.M,即包的子模块M P、 使用find_module()和load_module() 查找并加载包P,然后 在路径中使用find_module() 参数设置为P.u uu路径_uuu。当P 本身有一个虚线名称,应用此 配方递归

可能就是你想要的。特别是功能
import\u模块
。他们说:

importlib.import\u模块(名称,包=None)

导入模块。name参数指定以绝对或相对术语导入哪个模块(例如
pkg.mod
.mod
)。如果名称是以相对术语指定的,则必须将package参数设置为作为解析包名称的锚定的包的名称(例如,
import_模块(“…mod”,“pkg.subpkg”
)将导入
pkg.mod


对于其他查看此问题并寻找方法的人,以下是我使用的方法

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

好吧,如果你知道你在做什么,并且你认为imp检查太复杂,那么这个怎么样:

如果不是全部([x.isalnum()或x='.'代表名称中的x]):
raise VALUERROR('模块名称无效')
exec(“导入%s”%name)

我想要一个不加载父级的解决方案。是的,我知道,它会漏掉一些案例,但我不在乎。
module[1]
又是什么?@Michael瀑布有一个未定义的变量:
module
:我在你的基础上添加了我的实现,问题是,
importlib.import\u模块
即使只有
.pyc
文件仍然存在,也能成功地找到该模块。因此,如果您特别想检查文件系统中是否存在模块的
.py
文件,则不能使用此选项。
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