Python相对导入从父目录

3

在过去几天里,我阅读了许多关于相对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或使用sys.path.append()

有比我更有模块经验的人能提供任何见解吗?谢谢!


这个回答解决了你的问题吗?Python 3中的相对导入 - undefined
3个回答

3
答案建议更改sys路径是错误的-不幸的是,这些建议在网络上流传导致了无限的挫败感和崩溃(好的)到微妙的错误(坏的)。

正确的答案是使用-m开关从最顶层包的父文件夹运行您的脚本。因此,如果这个parent_folder看起来像是一个包,而且您想要运行file_1.py,您应该:

$ python -m parent_folder.subfolder1.file_1

任意一种导入方式都可以。

1
这真是太完美了,完全符合我想要的!还有感谢你理解 sys.append 的问题。我已经多次被告知不要在生产环境中使用它,甚至在我的问题中指明我宁愿不使用它,但每当我发布关于Python包的内容时,似乎总是人们的首选答案 叹气 - undefined
我理解这一点,也有类似的解决方案适用于包,就像在 https://dev59.com/xGYq5IYBdhLWcg3w8lNo 中提到的那个。然而,并非所有都是包,我发现使用 sys.append 的解决方案在使用 jupyter notebook 时很有用。 - undefined

0

更改路径

在开始导入任何内容之前,确保您更改sys.path以免在导入时出现错误

因此,请从以下内容开始:

import os, sys

path = os.path.join(os.path.dirname(__file__), os.pardir)
sys.path.append(path)

-1

在我的情况下,我这样做了

import sys
sys.path.insert(0, '..')

那么

from parent_folder.subfolder1.file_1 import --the-function-needed--

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接