Python 从父目录相对导入
Python Relative Import From Parent Directories
过去几天我阅读了很多关于相对 Python 导入的文档,但 运行 陷入了与以下文件夹结构的斗争:
parent_folder
├── subfolder1
│ └── __init__.py
│ └── file_1.py
├── subfolder2
│ └── __init__.py
│ └── file_2.py
│
└ __init__.py (parent folder has an init in it)
在 file_2.py
中,我想访问 file_1.py
中的功能。我尝试将以下内容添加到 file_2.py
但 none 似乎有效:
1. from ..subfolder1 import file_1 #ImportError: attempted relative import with no known parent package
2. import parent_folder.subfolder1.file_1 #ModuleNotFoundError: No module named 'parent_folder'
3. from parent_folder.subfolder1 import file_1 #ModuleNotFoundError: No module named 'parent_folder'
我现在真的迷路了,似乎不明白为什么会这样。我现在可能已经阅读了 10 种不同的相对导入指南,但仍然不明白为什么。
请注意,如果我将 file_2.py
放在 parent_folder
中,然后添加 import subfolder1.file1
它导入效果很好,但我不能从它的位置移动或使用 file_2.py
sys.path.append()
有没有比我有更多模块经验的人有任何见识?谢谢!
改变路径
确保在开始导入任何内容之前更改 sys.path
这样导入时就不会出现错误
所以,从这个开始:
import os, sys
path = os.path.join(os.path.dirname(__file__), os.pardir)
sys.path.append(path)
在我的例子中,我这样做了
import sys
sys.path.insert(0, '..')
然后
from parent_folder.subfolder1.file_1 import --the-function-needed--
建议弄乱 sys 路径的答案是错误的 - 不幸的是,这个建议在网络上流传,导致无限的挫败感和崩溃(好的)到细微的错误(坏的)。
正确答案是 运行使用 -m
开关从最顶层包的父文件夹中设置您的脚本。因此,如果这个 parent_folder
是一个包,就像它看起来的那样,而你想要 运行 file_1.py 你应该
$ python -m parent_folder.subfolder1.file_1
这三个导入中的任何一个都可以工作
过去几天我阅读了很多关于相对 Python 导入的文档,但 运行 陷入了与以下文件夹结构的斗争:
parent_folder
├── subfolder1
│ └── __init__.py
│ └── file_1.py
├── subfolder2
│ └── __init__.py
│ └── file_2.py
│
└ __init__.py (parent folder has an init in it)
在 file_2.py
中,我想访问 file_1.py
中的功能。我尝试将以下内容添加到 file_2.py
但 none 似乎有效:
1. from ..subfolder1 import file_1 #ImportError: attempted relative import with no known parent package
2. import parent_folder.subfolder1.file_1 #ModuleNotFoundError: No module named 'parent_folder'
3. from parent_folder.subfolder1 import file_1 #ModuleNotFoundError: No module named 'parent_folder'
我现在真的迷路了,似乎不明白为什么会这样。我现在可能已经阅读了 10 种不同的相对导入指南,但仍然不明白为什么。
请注意,如果我将 file_2.py
放在 parent_folder
中,然后添加 import subfolder1.file1
它导入效果很好,但我不能从它的位置移动或使用 file_2.py
sys.path.append()
有没有比我有更多模块经验的人有任何见识?谢谢!
改变路径
确保在开始导入任何内容之前更改 sys.path
这样导入时就不会出现错误
所以,从这个开始:
import os, sys
path = os.path.join(os.path.dirname(__file__), os.pardir)
sys.path.append(path)
在我的例子中,我这样做了
import sys
sys.path.insert(0, '..')
然后
from parent_folder.subfolder1.file_1 import --the-function-needed--
建议弄乱 sys 路径的答案是错误的 - 不幸的是,这个建议在网络上流传,导致无限的挫败感和崩溃(好的)到细微的错误(坏的)。
正确答案是 运行使用 -m
开关从最顶层包的父文件夹中设置您的脚本。因此,如果这个 parent_folder
是一个包,就像它看起来的那样,而你想要 运行 file_1.py 你应该
$ python -m parent_folder.subfolder1.file_1
这三个导入中的任何一个都可以工作