混合相对和绝对进口

时间:2019-09-12 13:07:20

标签: python-3.x python-3.6

我有一个结构如下的项目:

|-- package-1
|   |-- __init__.py
|   |-- module1.py
|   |-- module1_scheduler.py
|
|-- package-2
|   |-- __init__.py
|   |-- module2.py
|   |-- module2_scheduler.py
|   |-- subpackage2
|       |-- __init__.py
|       |-- module21.py
|       |-- module22.py
|
|-- package-3
    |-- module3.py    

出于显而易见的原因,我将必须从某些模块内部共享导入。所以:

module3.py

import sys, os
sys.path.append(os.path.abspath(".."))
import importlib
module1 = importlib.import_module("package-1.module1")
module2 = importlib.import_module("package-2.module2")

result1 = module1.some_function(a,b,c)
result2 = module2.other_function(d,e,f)

module2.py

from . subpackage2 import module21
from . subpackage2 import module22

module2_scheduler.py

import module2 as m2

现在我有两种不同的情况可以运行我的软件。

在第一种情况下,我运行module3.py,它运行得很好。

但是在第二种情况下,我调用了调度程序module2_scheduler.py,它返回了跟踪错误:

Traceback (most recent call last):
  File "/opt/app/package-2/module2_scheduler.py", line 1, in <module>
    import module2 as m2
  File "/opt/app/package-2/module2.py", line 1, in <module>
    from . subpackage2 import module21
ImportError: attempted relative import with no known parent package

如果我删除module2.py内部的相对导入,并使用绝对导入(例如import subpackage2.module21 as m21),则调度程序module2_scheduler.py可以正常工作。但是后来我不能使用module3.py,因为它返回ModuleNotFoundError: No module named 'module21'

因此,我被困在需要同时使用相对和绝对导入的位置,但这导致了上面提到的ImportError。任何想法都欢迎。谢谢。

0 个答案:

没有答案