我有一个结构如下的项目:
|-- 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
出于显而易见的原因,我将必须从某些模块内部共享导入。所以:
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)
from . subpackage2 import module21
from . subpackage2 import module22
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
。任何想法都欢迎。谢谢。