我正在试图找出如何参数化一个包路径,但无法弄明白。
以下是一个例子:
如果我执行以下操作,它可以工作,a,b是一个目录名,其中包含__init__.py
,最后一个目录b包含一个c.py文件,其中包含'd'作为类名
来自a.b.c import d(python接受它没有任何问题)
我正在尝试将目录'b'作为我可以动态传递的变量。
像: b ='y'< - 这个名字以某种方式动态计算出来 来自a.b.c import d
上面的标识符b是一个字符串,python不会接受它,看起来我可能需要:eval(),lambda,getattr()等将字符串'y'转换为模块标识符,但我不能让它工作。
有人可以帮助我,非常感谢!
布鲁斯
答案 0 :(得分:0)
wim@wim-imac:/tmp$ find a
a
a/__init__.py
a/b
a/b/__init__.py
a/b/c
a/b/c/__init__.py
a/y
a/y/__init__.py
a/y/c
a/y/c/__init__.py
wim@wim-imac:/tmp$ cat a/b/c/__init__.py
d = 'd in b'
wim@wim-imac:/tmp$ cat a/y/c/__init__.py
d = 'd in y'
现在importlib
已满足您的需求:
wim@wim-imac:/tmp$ python -i -c ""
>>> from importlib import import_module
>>> mod_a_b_c = import_module('a.b.c')
>>> mod_a_b_c.d
'd in b'
>>> mod_a_y_c = import_module('a.y.c')
>>> mod_a_y_c.d
'd in y'
这些是便利包装。如果您特别想要进行“from”样式导入,则必须直接使用__import__
magic method并使用fromlist
kwarg。这有点拖累语法,但仍有可能:
>>> d = __import__('a.b.c', fromlist=['d']).d
>>> d
'd in b'
>>> d = __import__('a.y.c', fromlist=['d']).d
>>> d
'd in y'