Python中的包路径错误

Package Pathing Errors in Python

所以我正在为我的Python实现一个文件结构,并且在执行导入时出错。文件结构如下所示:

1
2
3
4
5
6
7
8
9
10
11
12
Dirs(Folder)
   ╘ run.py
     Vers(Folder)
        ╘ __init__.py
          1_1(Folder)
             ╘ Main.py
               secondary.py
               __init__.py
          1_2(Folder)
             ╘ Main.py
               secondary.py
               __init__.py

这是run.py的内容

1
2
3
4
5
6
import importlib
print("This is the main module")
A = importlib.import_module(str("Vers.1_1.Main"))
A.start()
B = importlib.import_module(str("Vers.1_2.Main"))
B.start()

每个Main.pysecondary.py都包含相同的代码,但打印语句中的版本号除外,该版本号根据它们所在文件夹的版本号而更改。

1
2
3
4
5
6
7
8
9
10
11
12
13
Main.py

import secondary
class start():
    def __init__(self):
        print("This is version 1.2 main")
        secondary.start()

secondary.py

class start():
    def __init__(self):
        print("This is version 1.1 secondary")

这是我执行run.py时得到的输出。

1
2
3
4
5
6
7
8
9
10
11
12
13
This is the main module
Traceback (most recent call last):
  File"Python\Python36-32\lib\importlib\__init__.py", line 126, in import_module
return _bootstrap._gcd_import(name[level:], package, level)
  File"<frozen importlib._bootstrap>", line 978, in _gcd_import
  File"<frozen importlib._bootstrap>", line 961, in _find_and_load
  File"<frozen importlib._bootstrap>", line 950, in _find_and_load_unlocked
  File"<frozen importlib._bootstrap>", line 655, in _load_unlocked
  File"<frozen importlib._bootstrap_external>", line 678, in exec_module
  File"<frozen importlib._bootstrap>", line 205, in _call_with_frames_removed
  File"Dirs\Vers\1_1\Main.py", line 1, in <module>
import secondary
ModuleNotFoundError: No module named 'secondary'

因此,根据我的理解,run.py能够成功地找到并尝试从1_1文件夹导入Main.py。但是,在执行Main.py文件时,无法看到secondary.py在同一目录中进行导入。我试过寻找解决这个问题的方法,但我真的不知道我的问题是什么。我试图设置程序包的方式是否错误?如果是,我需要做什么改变才能使它正常工作?


简短回答:使用

1
from . import secondary

较长版本:当这是具有绝对导入语义的python 3时,看起来您假定python 2是相对导入语义。请看一下,例如,这里有更详细的解释。

如果你愿意的话

1
import secondary

这是一种绝对进口,因此相对于当前软件包,这不是解决问题的方法,而是从sys.path解决问题。

当您以python脚本(而不是使用-m的模块)执行run.py时,脚本所在的目录会自动添加到sys.path中,这就是导入Vers.1_1.Main的原因,但import secondary不起作用。


在导入之后,您的代码将在Dirs下执行,这里没有要导入的辅助模块。

变化

1
import secondary

Main.py

1
import Vers.1_1.secondary

并且

1
import Vers.1_2.secondary

在另一个Main.py