问题描述
过去几天我阅读了许多关于 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
,但似乎都不起作用:
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
或使用 {{ 1}}
有比我更了解模块经验的人吗?谢谢!
解决方法
建议弄乱 sys 路径的答案是错误的 - 不幸的是,这个建议在网络上漂浮,导致无限的挫败感和崩溃(好)到细微的错误(坏)。
正确的答案是使用最顶层包的父文件夹中的 -m
开关运行您的脚本。因此,如果此 parent_folder
是一个包,并且您想运行 file_1.py,您应该
$ python -m parent_folder.subfolder1.file_1
三个导入中的任何一个都可以工作
,更改路径
确保在开始导入任何内容之前更改 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--