具有相对路径的Python3 importlib.util.spec_from_file_location?

时间:2018-02-17 12:14:19

标签: python

有很多关于如何导入relative packagesexplicit location的python问题(链接到两个流行的例子)。

此外,始终有documentation

读完这篇文章之后,我仍然不太清楚什么是规格,它们与模块有什么关系,以及为什么需要对它进行标记化。

所以对于那些不理解的人,你能不能试着解释一下如何做到这一点(以编程方式和引擎盖下的方法)

e.g。

如果我有

proj-dir
--mod1
--|--__init__.py
--|--class1.py
--mod2
--|--__init__.py
--|--class2.py

如何将mod2导入mod1?

import sys
sys.path.insert(0, "../mod2")

这在技术上有效,但我担心如果我试图挑选物品并在其他地方使用它们,它可能在未来引起问题......

建议explicit location

import importlib.util
spec = importlib.util.spec_from_file_location("module.name", "/path/to/file.py")
foo = importlib.util.module_from_spec(spec)
spec.loader.exec_module(foo)
foo.MyClass()

所以在这种情况下我只是这样做:

import importlib.util
spec = importlib.util.spec_from_file_location("mod2.class2", "../mod2/class2.py")
foo = importlib.util.module_from_spec(spec)
spec.loader.exec_module(foo)
foo.MyClass()

...

1 个答案:

答案 0 :(得分:1)

首先,让我澄清 Python模块和&一个 Python包,以便我们俩都在同一页面上。 ✌

模块是单个.py文件(或多个文件),它们在一个导入下导入并使用。 ✔

import aModuleName # Here 'aModuleName' is just a regular .py file.

然而,包是给出包层次结构的目录中的模块集合。包中包含不同的 __init__.py 文件。 ✔

from aPackageName import aModuleName # Here 'aPackageName` is a folder with a `__init__.py` file # and 'aModuleName', which is just a regular .py file.

因此, proj-dir 的正确版本会是这样的,⤵ proj-dir --|--__init__.py --package1 --|--__init__.py --|--module1.py --package2 --|--__init__.py --|--module2.py

  

请注意,我还在 proj-dir 本身添加了一个空的 __init__.py ,这也使它成为一个包。

现在,如果要将 package2 module2 中的任何python对象导入 package1 module1 ,然后 module1.py 文件中的导入语句将

from proj-dir.package2.module2 import object2 # if you were to import the entire module2 then, from proj-dir.package2 import module2

我希望这个简单的解释能够澄清你对Python导入机制的怀疑。