Python中的包路径错误

Python中的包路径错误,python,packages,python-import,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)

因此,我正在为我的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()
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'
每个
Main.py
secondary.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

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()
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'
这是主模块
回溯(最近一次呼叫最后一次):
文件“Python\Python36-32\lib\importlib\\ uuuuu init\ uuuuu.py”,第126行,在导入模块中
return _bootstrap._gcd_import(名称[级别:],包,级别)
文件“”,第978行,在_gcd_import中
文件“”,第961行,在“查找”和“加载”中
文件“”,第950行,在“查找”和“加载”中解锁
文件“”,第655行,已加载
exec_模块中第678行的文件“”
文件“”,第205行,在调用中删除了帧
文件“Dirs\Vers\1\u 1\Main.py”,第1行,在
进口二手货
ModuleNotFoundError:没有名为“secondary”的模块
因此,据我所知,
run.py
能够成功地从
1\u 1
文件夹中查找并尝试导入
Main.py
。但是,在执行
Main.py
文件时,无法看到
secondary.py
与导入它的目录相同。我试着寻找如何解决这个问题,但我真的不知道我的问题是什么。我尝试设置包的方式是否错误?如果是这样的话,我需要改变什么才能使它正常工作?

简短回答:使用

from . import secondary
更长的版本:看起来您假设Python2具有相对导入语义,而Python3具有绝对导入语义。看一看,例如,以获得更详细的解释

如果你这样做

import secondary
这是一个绝对导入,因此不是相对于当前包来解析的,而是来自
sys.path


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

导入后,您的代码将在
Dirs
下执行,其中没有要导入的secondary模块

改变

import secondary
Main.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()
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'

以及

import Vers.1_2.secondary

在另一个
Main.py中

非常感谢。这可能是我最好的解决方案,因为我不希望每次创建新版本目录时都必须修改所有导入语句:P@Skitzafreak ... 这正是为什么会有这些漂亮的显式相对导入的原因之一;-)。不过有一个问题。假设我从Mod import ClassA导入了一个类似
。我将如何将其从更改为
。导入
符号?从中执行
。从.Mod import ClassA导入Mod.ClassA
工作?@Skitzafreak
<代码>来自。。。导入
仅允许您直接导入子模块,而不是作为子模块导入(除非外部模块为您这样做)。
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()
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'