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

这三个导入中的任何一个都可以工作