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