我希望能够基于version files
导入其他version_number
。
这是我的目录结构
|_ /src
|_ main.py
|_ /models/v_0_0_x/m.py
|_ /schema/v_0_0_x/s.py
|_ /templates/v_0_0_x/t.py
我的main.py
看起来像这样:
version = "v_0_0_2"
from models.$version.models import *
我一直在使用一些sys
路径,但是我认为应该为此提供更清洁的解决方案。
答案 0 :(得分:2)
使用importlib
的确切方法取决于您使用的Python版本。我正在使用Python 3.7。
在models/v_0_0_2/models.py
内,我定义了foo = 'Hello world!
。
import importlib.util
import os
version = 'v_0_0_2'
path = os.path.join('models', version, 'models.py')
spec = importlib.util.spec_from_file_location('models', path)
models = importlib.util.module_from_spec(spec)
spec.loader.exec_module(models)
print(models.foo)
结果:
Hello world!
编辑:
我在上面显示的内容等同于import x.y.z as z
。
如果您想模仿from x.y.z import *
,则可以执行以下附加步骤:
globals().update({k: v for k, v in models.__dict__.items() if not k.startswith('_')})
del models
print(foo)
答案 1 :(得分:0)
如何更改导入名称,以便以后通过“ as”更好地访问:
import os.path as p
然后,您可以通过以下方式访问该导入的功能:
p.join("a", "b")
结果输出:
'a/b'
对于您的项目,将是:
import models.$version.models as current_models
我不确定这是否是解决方案,并且不能与您导入的模块一起使用。我经常使用它来缩短模块名称。这应该适用于任何Python版本。