如何从Python中的不同目录导入文件

时间:2019-08-02 17:50:40

标签: python

我希望能够基于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路径,但是我认为应该为此提供更清洁的解决方案。

2 个答案:

答案 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版本。