imp.find_module
的现有实现是否适用于虚线模块名称?它不需要是防弹的,如果它在某些情况下不起作用也没关系。但它起作用的案例越多越好。
请不要尝试在答案中实现此功能。我已经实现了我的版本,我问是否有现有的实现,因为如果有的话,它可能比我的版本测试得多。
答案 0 :(得分:5)
importlib可能就是你所追求的。特别是函数import_module
。 docs说:
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)