Python 中的包路径错误
Package Pathing Errors in Python
所以我正在为我的 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.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
时得到的输出
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\Main.py", line 1, in <module>
import secondary
ModuleNotFoundError: No module named 'secondary'
据我了解,run.py
能够成功找到并尝试从 1_1
文件夹中导入 Main.py
。但是执行Main.py
文件时,无法看到secondary.py
在同一个目录下导入。我试过寻找如何解决这个问题,但我真的不知道我的问题是什么。我尝试设置包的方式是错误的吗?如果是这样,我需要更改什么才能使其正常工作?
简答:使用
from . import secondary
更长的版本:看起来你假设 Python 2 relative import 语义,当这是 Python 3 with absolute import 语义。看看例如 以获得更详细的解释。
如果你这样做
import secondary
这是绝对导入,因此 不是 相对于当前包解析的,而是来自 sys.path
.
当您将 run.py
作为 Python 脚本执行时(而不是作为带有 -m
的模块),脚本所在的目录会自动添加到 sys.path
,这就是导入 Vers.1_1.Main
有效但 import secondary
无效的原因。
导入后您的代码在 Dirs
下执行,其中没有要导入的辅助模块
改变
import secondary
在Main.py
至
import Vers.1_1.secondary
和
import Vers.1_2.secondary
在另一个Main.py
所以我正在为我的 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.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
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\Main.py", line 1, in <module>
import secondary
ModuleNotFoundError: No module named 'secondary'
据我了解,run.py
能够成功找到并尝试从 1_1
文件夹中导入 Main.py
。但是执行Main.py
文件时,无法看到secondary.py
在同一个目录下导入。我试过寻找如何解决这个问题,但我真的不知道我的问题是什么。我尝试设置包的方式是错误的吗?如果是这样,我需要更改什么才能使其正常工作?
简答:使用
from . import secondary
更长的版本:看起来你假设 Python 2 relative import 语义,当这是 Python 3 with absolute import 语义。看看例如
如果你这样做
import secondary
这是绝对导入,因此 不是 相对于当前包解析的,而是来自 sys.path
.
当您将 run.py
作为 Python 脚本执行时(而不是作为带有 -m
的模块),脚本所在的目录会自动添加到 sys.path
,这就是导入 Vers.1_1.Main
有效但 import secondary
无效的原因。
导入后您的代码在 Dirs
下执行,其中没有要导入的辅助模块
改变
import secondary
在Main.py
至
import Vers.1_1.secondary
和
import Vers.1_2.secondary
在另一个Main.py