Python中的包路径错误

时间:2017-12-14 19:27:37

标签: python packages python-import

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

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

的内容
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都包含相同的代码,这些代码会根据文件夹的版本号而改变。

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

时得到的输出
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能够成功找到并尝试从Main.py文件夹中导入1_1。但是,在执行Main.py文件时,无法看到secondary.py位于同一目录中以进行导入。我已经尝试过如何解决这个问题,但我真的不知道我的问题是什么。我是如何尝试设置包错误的?如果是这样,我需要更改什么才能使其正常工作?

2 个答案:

答案 0 :(得分:1)

简短回答:使用

from . import secondary

更长的版本:看起来你假设Python 2 相对导入语义,当这是带有绝对导入语义的Python 3时。看看,例如here有更详细的解释。

如果你这样做

import secondary

这是绝对导入,因此相对于当前包解析,而是来自sys.path

当您执行run.py作为Python脚本(而不是具有-m的模块)时,脚本所在的目录会自动添加到sys.path,这就是导入{{}的原因。 1}}有效,但Vers.1_1.Main没有。

答案 1 :(得分:0)

导入后,您的代码在$''下执行,其中没有要导入的辅助模块

更改

Dirs
import secondary

中的

Main.py

import Vers.1_1.secondary

在另一个import Vers.1_2.secondary